Spanish [SOLUCIONADO] CARGAR IMAGEN EN IMAGEVIEW

J M Movilla Cuadrado

Member
Licensed User
Apreciado amigo Jesús: Una cosa es que estéis dispuestos a ayudar, y otra es que vuestra disposición sea tan rápida como el Whatsapp, con billete de ida y vuelta... Muchas gracias. Voy a intentarlo.
 

bgsoft

Well-Known Member
Licensed User
Apreciado amigo Jesús: Una cosa es que estéis dispuestos a ayudar, y otra es que vuestra disposición sea tan rápida como el Whatsapp, con billete de ida y vuelta... Muchas gracias. Voy a intentarlo.

Es que ademas del riberita y la morcilla me quiero ganar algun choricito picante :D

La verdad es que "intento" entrar cada dia y asi ayudar en la medida que puedo. He visto que Anton aun no veia la imagen y he visto cual era el problema, y ademas estaba tu pregunta, asi que dos por el precio de uno.

Un abrazo mi querido y joven forero
 

bgsoft

Well-Known Member
Licensed User
¿Tú tampoco la veías sin tu modificación Jesús? A mí si me salía la imagen. Es verdad que al girar la pantalla daba el error que indicas de memoria, pero sí se cargaban...

Depende en que dispositivo, en una tablet no, en otro con mucha mas resolución si, he mirado de cuanto era la imagen, y al ver 2322 x 4128 estaba claro cual era el problema.
Yo cuando tengo que cargar imagenes lo hago jugando con el InitializeSample, y ademas cuando salgo de ese formulario descargo las imagenes, si no el outofmemory te sale y mas si el dispositivo tiene poca memoria. Android al igual que la mayoria de sistemas operativos gestiona mal la memoria.

Saludos
 

J M Movilla Cuadrado

Member
Licensed User
Acabo de ejecutar el aplicativo "rotacion", tal como viene en el .zip de José J.

A la primera se me ha presentado el archivo 7.jpg en portrait y en landscape, sin ningún problema. Al girar el móvil, me siguen apareciendo las dos imágenes, pero la inferior NO CABE en la pantalla; sólo se ve la cuarta parte superior.

(El ribera y la morcilla siguen en pie; y te has ganado ya el choricito picante...)

___________________________

Perdón; no sé por qué me dio la impresión de que las imágenes presentadas eran diferentes: las dos son exactamente iguales...
 
Last edited:

Anton Solans Argemí

Member
Licensed User
Por fin lo he conseguido, solucionado con el InitializeSample.

Muchísimas gracias por la colaboración de todos !!!!

Envío código que me ha quedado por si alguien le sirve de ayuda:

B4X:
#Region  Project Attributes 
 #ApplicationLabel: rotar
 #VersionCode: 1
 #VersionName: 
 'SupportedOrientations possible values: unspecified, landscape or portrait.
 #SupportedOrientations: unspecified
 #CanInstallToExternalStorage: False
#End Region
#Region  Activity Attributes 
 #FullScreen: False
 #IncludeTitle: True
#End Region
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 gsdirimg As String
 Dim imagen                 As Bitmap
 Dim nombreimg                As String
 
 Dim bitmapOriginal                                                          As Bitmap
 Dim bitmapRotated                                                           As Bitmap
 Dim exifdataInstance                                                        As ExifData
 Dim booleanNeedToWriteRotatedBitmap,booleanError       As Boolean
 
 
 Private imgAntes As ImageView
 Private imgDespues As ImageView
 
 
End Sub

Sub Activity_Create(FirstTime As Boolean)
 Activity.LoadLayout("1")
 gsdirimg = Starter.rp.GetSafeDirDefaultExternal("")
 File.Copy(File.DirAssets, "7.jpg", gsdirimg, "7.jpg")
 Log("Archivo Copiado")
 Dim bmp As Bitmap
 bmp.Initializesample(gsdirimg, "7.jpg",100%x,100%y)
 imgAntes.Bitmap=bmp
 
 imgDespues.Bitmap=GetRotatedBitmap
 
End Sub
Sub GetRotatedBitmap As Bitmap
 Dim bitmapOriginal As Bitmap
 Dim bitmapRotated As Bitmap
 Dim exifdataInstance As ExifData
 Try
  booleanNeedToWriteRotatedBitmap = False
  exifdataInstance.Initialize (gsdirimg, "7.jpg")
  bitmapOriginal.InitializeSample  (gsdirimg, "7.jpg",100%x,100%y)
 
  Select Case exifdataInstance.getAttribute (exifdataInstance.TAG_ORIENTATION)
   Case exifdataInstance.ORIENTATION_ROTATE_90
    Log("ORIENTATION_ROTATE_90")
    bitmapRotated = bitmapOriginal.rotate (90)
   Case exifdataInstance.ORIENTATION_ROTATE_180
    Log("ORIENTATION_ROTATE_180")
    bitmapRotated = bitmapOriginal.rotate (180)
   Case exifdataInstance.ORIENTATION_ROTATE_270
    Log("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
 

bgsoft

Well-Known Member
Licensed User
Hola Anton, me alegro que lo consiguieras.

Al principio de tu post dijiste que quieres guardar esa imagen, luego te surgió lo de girarla. Por tanto la tendras que volver a guardar una vez girada, asi que podrias mejorar un poco mas el codigo y el uso de memoria. Como te comenté la carga normal consume mucha memoria, y ya viste el post de José que le cargaba la imagen y al girar el dispositivo le daba un outofmemory, por que volvia a cargarla y eran dos cargas por volver a entrar en Activity_Create.
Cambia el que te devuelva el bitmap por un boolean, de esa forma sabras si debes pintar la imagen original o la rotada, y en el caso de que asi sea, carga el imagenView en modo InitializeSample, de esa forma tendras menos problemas de memoria.

Y si quieres reaprovechar todo el codigo para el futuro, crea un sub que le pases dir y nombre de imagen y te devuelva la rotación (cero si no hay), cuando salgas de ese sub descarga los bitmap que hayas utilizado.
Crea un sub que te guarde la imagen con la rotación que le pases, cuando salgas de ese sub descarga los bitmap que hayas utilizado. (tambien puedes crear en el mismo sub de rotación que la guarde)

De esta forma, cuando tengas que hacer otra aplicación no deberas de generar de nuevo código concreto, copias esos sub y listo, su tratamiento será como "una caja negra", pasas datos, hace cosas y devuelve algo (o no) sin preocuparte como lo hiciste.



Saludos
 

Anton Solans Argemí

Member
Licensed User
Muchas gracias por tus mejoras. Probaré todo lo que me dices.
Una pregunta, cuando dices descarga los bitmap que hayas utilizado, que debo hacer?
 

bgsoft

Well-Known Member
Licensed User
Una pregunta, cuando dices descarga los bitmap que hayas utilizado, que debo hacer?

Bueno, quizas los "puristas" te digan otra cosa :D , he tenido que hacer varias aplicaciones donde habia que cargar muchas imagenes, y al final decidí saber cuanta ram realmente quedaba en el dispositivo después de emplear diferentes métodos. El mas usual es hacer un remove del objeto, y teoricamente tendria que descargarse la ram, pero como te he comentado la gestion de memoria en Android no es magnifica. Al final lo que hice es crearme una imagen de 1 byte, y cargarla en la que habia cargado y luego hacer un remove. A MI esto es lo que mejor me funcionó, seguro que habrá otros que les vaya mejor otros métodos. Pero este no está basado en la teoria, si no en la práctica, y sobre todo cargar las imagenes con InitializeSample, que se creó con ese fin.

Hice una rutina que lo hace, y asi no tienes que implementarlo en todas las descargas de imagenes.

Esto lo hice hace tiempo, actualmente lo sigo empleando y no me he planteado si la gestión de memoria va mejor (posiblemente si) o si han sacado nuevos métodos. Como se decia en mi época de inicio a la programación,"si funciona, no lo toques" :D



Saludos
 

J M Movilla Cuadrado

Member
Licensed User
Uy... Perdona, Jesús. Estoy muy liado con ese montón de obligaciones que nos surgen a los jubilados... y se me olvidó agradecerte tu solución. Entre las obligaciones y el frío... ¿sabes? no es raro que se congelen las ideas. Aunque tardío, muchas gracias.
 
Top