Spanish [SOLUCIONADO] CARGAR IMAGEN EN IMAGEVIEW

Anton Solans Argemí

Member
Licensed User
En mi aplicación hago una foto (verticalmente), aunque la podría hacer tanto en formato vertical como horizontal y la guardo en un directorio. Si a través de la Galería del dispositivo voy a visualizar la imagen en dicho directorio la veo correctamente tal y como la he fotografiado (verticalmente) pero al cargarla en un ImageView de esta forma:

ImageView7.Bitmap=LoadBitmapSamle(Directorio_donde_esta_la_imagen,nombre_imagen.jpg,100%x,100%y)

En el ImageView la veo horizontalmente.

¿A que es debido? ¿Que estoy haciendo mal?
 

José J. Aguilar

Well-Known Member
Licensed User

Anton Solans Argemí

Member
Licensed User
Estoy haciendo la siguiente prueba:


Sub Activity_subGetRotatedBitmap As Bitmap
Dim bitmapOriginal As Bitmap
Dim bitmapRotated As Bitmap
Dim exifdataInstance As ExifData
Dim booleanNeedToWriteRotatedBitmap,booleanError As Boolean



Try
booleanNeedToWriteRotatedBitmap = False
exifdataInstance.Initialize (directorio_donde_esta_la_imagen, "nombre_imagen.jpg")
bitmapOriginal.Initialize (directorio_donde_esta_la_imagen,, "nombre_imagen.jpg")
Select Case exifdataInstance.getAttribute (exifdataInstance.TAG_ORIENTATION)
Case exifdataInstance.ORIENTATION_ROTATE_90
bitmapRotated = bitmapOriginal.rotate (90)
Case exifdataInstance.ORIENTATION_ROTATE_180
bitmapRotated = bitmapOriginal.rotate (180)
Case exifdataInstance.ORIENTATION_ROTATE_270
bitmapRotated = bitmapOriginal.rotate (270)
Case Else
Return bitmapOriginal
End Select
booleanNeedToWriteRotatedBitmap = True
Return bitmapRotated
Catch
booleanError = True
Return Null
End Try
End Sub


He añadido la librería JPegUitls.

Y al ejecutarlo me da el siguiente error:

B4A Version: 8.00
Parsing code. (0.00s)
Compiling code. (0.02s)
Compiling layouts code. (0.00s)
Organizing libraries. (0.00s)
Generating R file. Error
res\values-v20\theme.xml:3: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/Theme.Material'.
 

bgsoft

Well-Known Member
Licensed User
Hola Anton:

Mira donde te ha dicho José, habitualmente eso suele ser un problema de instalación del B4A, aqui te explican como instalarlo directamente:
https://www.b4x.com/b4a.html#installation

Con respecto a tu pregunta, la galeria cuando tu haces una foto mira los datos EXIF de la foto y la gira si es necesario. La foto que no necesita giro es en horizontal (partiendo del movil en vertical) pero girando el movil a la izquierda (al reves de las agujas del reloj) , todo lo demas requiere giro, y el imageView no las gira automaticamente.


Saludos
 

Anton Solans Argemí

Member
Licensed User
Hola José y bgsoft, primero de todo daros las gracias por vuestra ayuda.

El problema de instalación ya lo he arreglado poniendo el android-28 ya que tenía puesto el android-19 en la configuración de rutas del android.jar
C:\Android\android-sdk\platforms\android-28\android.jar

Ahora estoy probando lo de la rotación de la imagen, pero al ser principiante me está costando un poco. Enseguida que finalice las pruebas os comunico si lo he conseguido o necesito más ayuda!

Muchas gracias!
 

Anton Solans Argemí

Member
Licensed User
No me visualiza la imagen rotada.

Os envio el código a ver si me podéis decir que estoy haciendo mal:

B4X:
Sub Process_Globals
 'These global variables will be declared once when the application starts.
 'These variables can be accessed from all modules.
End Sub
Sub Globals
 'These global variables will be redeclared each time the activity is created.
 'These variables can only be accessed from this module.
 Dim gsdirapp As String 
 gsdirapp=File.DirRootExternal & "/" & "directorio_App"
 
 Dim gsdirjpg As String
 gsdirjpg=gsdirapp & "/subdirectorio_jpgs/"
 
 Private ImageView1 As ImageView
 
 Dim bitmapOriginal                                                          As Bitmap
 Dim bitmapRotated                                                           As Bitmap
 Dim exifdataInstance                                                        As ExifData
 Dim booleanNeedToWriteRotatedBitmap,booleanError       As Boolean
End Sub

Sub Activity_Create(FirstTime As Boolean)
 Activity.LoadLayout("1")
 GetRotatedBitmap 
End Sub
Sub GetRotatedBitmap As Bitmap
 Dim bitmapOriginal                                                          As Bitmap
 Dim bitmapRotated                                                           As Bitmap
 Dim exifdataInstance                                                        As ExifData
 
 Try
  booleanNeedToWriteRotatedBitmap = False
  exifdataInstance.Initialize (gsdirjpg, "nombre_imagen.jpg")
  bitmapOriginal.Initialize   (gsdirjpg, "nombre_imagen.jpg")
  Select Case exifdataInstance.getAttribute (exifdataInstance.TAG_ORIENTATION)
   Case exifdataInstance.ORIENTATION_ROTATE_90
    bitmapRotated = bitmapOriginal.rotate (90)
   Case exifdataInstance.ORIENTATION_ROTATE_180
    bitmapRotated = bitmapOriginal.rotate (180)
   Case exifdataInstance.ORIENTATION_ROTATE_270
    bitmapRotated = bitmapOriginal.rotate (270)
   Case Else
    Return bitmapOriginal
  End Select
  booleanNeedToWriteRotatedBitmap = True
  ImageView1.Bitmap=LoadBitmapSample(gsdirjpg,bitmapRotated,100%x,100%y)
  Return bitmapRotated
 Catch
  booleanError = True
  Return Null
 End Try
End Sub
 

bgsoft

Well-Known Member
Licensed User
Hola Antón:

Sin ver el layout es dificil saber ciertas cosas, pero entre otras de un vistazo rápido puedo ver:
- No creas los directorios gsdirjpg ni gsdirapp, pero sobre todo haces una llamada a GetRotatedBitmap que te devuelve el bitmap (a pintar) pero no lo asignas a nada, asi que si no lo asignas a una imagen que esté en el layout o la crees en tiempo de ejecución no podrás verla (supongo que para eso creaste ImageView1)

Saludos
 
Last edited:

Anton Solans Argemí

Member
Licensed User
Los directorios ya los tengo creados.

En el Layout lo único que tengo es un ImageView.

Lo estoy asignando de esta manera:

B4X:
ImageView1.Bitmap=LoadBitmapSample(gsdirjpg,bitmapRotated,100%x,100%y)
 

José J. Aguilar

Well-Known Member
Licensed User
¿Puedes subir tu proyecto o uno nuevo recreando lo que te pasa? Es más sencillo ayudarte.
Desde el proyecto le das a "Archivo->Exportar como ZIP" y lo adjuntas.
Cuida que no tengas datos sensibles (direcciones IP o contraseñas de FTP o algo)
 

Anton Solans Argemí

Member
Licensed User
Buenos días,

Te envio zip del programa y la imagen.

La imagen originalmente está hecha en formato vertical pero le he tenido que reduir el peso sinó no me dejaba enviarla y ya verás que la ha girado.
 

Attachments

José J. Aguilar

Well-Known Member
Licensed User
Hola Antón:

- No vale con pasar sólo el nombre de la imagen, tienes que pasar la RUTA completa de la imagen. Yo la he copiado al DirAssets (verás que ahora aparece en administrador de archivos del IDE).
- Desde ahí la leo la primera vez, pero es un directorio de sólo lectura, parece que para leer los datos exif la imagen se debe abrir para escritura o algo, porque no me funcionaba desde ahí, por lo que la he copiado a otro directorio
B4X:
File.Copy(File.DirAssets, "7.jpg", Starter.rp.GetSafeDirDefaultExternal(""), "7.jpg")
Una vez hecho esto, parece que funciona.
Dejo en tus manos modificar la función GetRotatedBitmap, para que le pases como argumentos por ejemplo una ruta y una imagen y te sirva de forma genérica. Algo como:
B4X:
GetRotatedBitmap (Dir as String, Imagen as String) As Bitmap
 

Attachments

Anton Solans Argemí

Member
Licensed User
No lo entiendo, no logro visualizar ninguna de las imágenes (ni la de antes ni la de después), me sale la pantalla en blanco.

Si lo pongo en modo Debug no me da ningún error.

Compruebo que la imagen esté en el directorio donde se copia y si que está.
 

Anton Solans Argemí

Member
Licensed User
He reducido el tamaño de los imageview para apreciar algun cambio y observo que al ejecutar la app la imagen de después aparece en otra tonalidad de blanco, por lo tanto es como si se viera solo una imagen y en blanco.

Lo que me parece muy raro es que la de la imagen de antes no se vea nada.
 

J M Movilla Cuadrado

Member
Licensed User
Con la idea de poder aportar una ayuda (no me toméis por iluso, por favor...), estoy intentando ejecutar rotacion.b4a, y me encuentro con el mensaje de que "falta la biblioteca jpegutils". Ni buscando jpegutils ni buscando ExifData consigo bajarme la biblioteca que me permita ejecutar la aplicación. Y, ya sabéis; estoy seguro de que alguien me sacará del atolladero (aunque el tema que pido no encaje con el título del tema).
 

bgsoft

Well-Known Member
Licensed User
Hola

Las imagenes no las ves por un problema de tamaños, eso sin contar que si no haces las imágenes proporcionales a la imagen que cargas saldran mal, he probado a hacer una carga con InitializeSample y se ven y la gira, asi que el código está bien.

Por otro lado, si cargas varias imagenes de tanto peso, te saldrá un OutOfmemory , te aconsejo que lo hagas con InitializeSample y busques un compromiso entre carga y que se vea bien.

Saludos
 
Last edited:

bgsoft

Well-Known Member
Licensed User
Con la idea de poder aportar una ayuda (no me toméis por iluso, por favor...), estoy intentando ejecutar rotacion.b4a, y me encuentro con el mensaje de que "falta la biblioteca jpegutils". Ni buscando jpegutils ni buscando ExifData consigo bajarme la biblioteca que me permita ejecutar la aplicación. Y, ya sabéis; estoy seguro de que alguien me sacará del atolladero (aunque el tema que pido no encaje con el título del tema).
Hola José María:

la libreria está aqui:

https://www.b4x.com/android/forum/threads/jpegutils-library-gives-access-to-exif-data.11629/#content

El ExitData está dentro como un objeto de la libreria

Cuando quieras buscar una libreria pon el nombre de la libreria y luego library ;)

Aquí estan las librerias internas:
https://www.b4x.com/android/forum/threads/updates-to-internal-libraries.59340/#content

Saludos
 
Top