Spanish Problema al guardar fotos en BD SQLite [SOLUCIONADO]

JMMF

Member
Licensed User
Longtime User
Hola a todos

He creado una BD SQLite con DBBrowser, para guardar varios campos (Nº de pale, cantidad, tipo, lote…) en el teléfono, hasta aquí todo bien;

Pero sería un puntazo guardar también una foto de la etiqueta de cada pale; Y manos a la obra, hago esto. (Pequeña modificación de CameraIntent de Erel).
B4X:
Sub Process_Globals
    Private ion As Object
    Private const Foto As String = "EnvasesFoto.jpg"
    Private codifica As StringUtils

End Sub

Sub Globals
    Private ImageView1 As ImageView
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("1")
    If Main.CreaFoto Then
        Main.CreaFoto = False
        TakePicture
    Else
        ImageView1.Bitmap = Main.FotoExistente
    End If
End Sub

Sub Button1_Click
    TakePicture
End Sub

Sub TakePicture
    Dim i As Intent
    i.Initialize("android.media.action.IMAGE_CAPTURE", "")
    Dim uri As Uri
    File.Delete(Main.Ruta, Foto)
    uri.Parse("file://" & File.Combine(Main.Ruta, Foto))
    i.PutExtra("output", uri) 'La imagen se guardará en esta ruta
    Try
        StartActivityForResult(i)
    Catch
        ToastMessageShow("La cámara no está disponible.", True)
    End Try

End Sub

'El resultado llega aquí
Sub ion_Event (MethodName As String, Args() As Object) As Object
    If Args(0) = -1 Then
        Try
            Dim in As Intent = Args(1)
            If File.Exists(Main.Ruta, Foto) Then
                Main.FotoNueva = LoadBitmapSample(Main.Ruta, Foto, ImageView1.Width, ImageView1.Height)
                ImageView1.Bitmap = Main.FotoNueva
            Else If in.HasExtra("data") Then 'Tratar de obtener miniatura en su lugar
                Dim jo As JavaObject = in
                Main.FotoNueva = jo.RunMethodJO("getExtras", Null).RunMethod("get", Array("data"))
            End If
        Catch
            Log(LastException)
        End Try
    End If
    If Main.FotoNueva.IsInitialized Then ImageView1.Bitmap = Main.FotoNueva
    'Convertir el archivo de imagen en un array de bytes
        Dim InputStream1 As InputStream
    InputStream1 = File.OpenInput(Main.Ruta, Foto)
    Dim OutputStream1 As OutputStream
        OutputStream1.InitializeToBytesArray(1000)
        File.Copy2(InputStream1, OutputStream1)
        Dim Buffer()  As Byte
        Buffer = OutputStream1.ToBytesArray
    Main.CadenaFotoNueva = codifica.EncodeBase64(Buffer) ' Convierte la imagen a String (cadena de caracteres.
    Main.CreaFoto = True
    Return Null
   
   
End Sub


Sub StartActivityForResult(i As Intent)
   Dim jo As JavaObject = GetBA
   ion = jo.CreateEvent("anywheresoftware.b4a.IOnActivityResult", "ion", Null)
   jo.RunMethod("startActivityForResult", Array As Object(ion, i))
End Sub

Sub GetBA As Object
   Dim jo As JavaObject
   Dim cls As String = Me
   cls = cls.SubString("class ".Length)
   jo.InitializeStatic(cls)
   Return jo.GetField("processBA")
End Sub

Pero 1.

Las fotos las pasa al ImageView en horizontal.

2.

Sería ideal poder hacer zum, ya que me veo menos que un gato de escayola.

Después paso la foto a una variable string, para guardarla en la BD.
B4X:
    Main.CadenaFotoNueva = codifica.EncodeBase64(Buffer) ' Convierte la imagen a String (cadena de caracteres.

Y cuando intenta guardarla
B4X:
Sub BotonGuardar_Click
    Dim Resultado As Int
    If Nuevo Then
        Resultado = Msgbox2("¿Guardamos los detalles del nuevo Palet_Envase?", "Guardar", "Si","No","",Main.Imagen(3))
        If Resultado = DialogResponse.POSITIVE Then
'Guarda los nuevos detalles de la descarga
            MySQLDetallesDescarga.ExecNonQuery("INSERT INTO DetallesDescarga  VALUES(?,'" & Descargas.MyCursorDescargas.GetString("BDClave_Descargas") & "','" & Clave_Producto & "','" & Edit12.Text & "','" & Edit13.Text & "','" & Edit14.text & "','" & Edit15.text & "','" & Edit13.Text  & "',0,'" & Main.CadenaFotoNueva & "')"  )
        End If
        Pnl02.Visible=False
        If Pnl01.IsInitialized Then Pnl01.Visible=True
        Rellena_Cursor
    Else
        Resultado = Msgbox2("¿Guardamos los cambios?", "Guardar", "Si","No","",Main.Imagen(3))
        If Resultado = DialogResponse.POSITIVE Then
'Guarda los cambios de los detalles de la descarga
            MySQLDetallesDescarga.ExecNonQuery("UPDATE DetallesDescarga SET BDClave_Producto = '" & Clave_Producto & "', BDNPalet_Envase = '" & Edit12.Text & "', BDCantidad = '" & Edit13.Text & "', BDLote = '" & Edit14.Text & "', BDObservaciones = '" & Edit15.Text & "', BDFoto = '" & Main.CadenaFotoNueva & "' WHERE BDClave_DetallesDescarga ='" & MyCursorDetallesDescarga.GetString("BDClave_DetallesDescarga") & "'")
        End If
        Pnl02.Visible=False
        If Pnl01.IsInitialized Then Pnl01.Visible=True
        Rellena_Cursor
    End If
End Sub

El simpático del Logs me dice que una MIE… y esto.

detallesdescarga_botonguardar_click (java line: 482)
java.lang.OutOfMemoryError: Failed to allocate a 8372236 byte allocation with 3462688 free bytes and 3MB until OOM
at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
at java.io_OutputStreamWriter.flushBytes(OutputStreamWriter.java:170)
at java.io_OutputStreamWriter.convert(OutputStreamWriter.java:184)
at java.io_OutputStreamWriter.write(OutputStreamWriter.java:269)
at java.io.PrintWriter.doWrite(PrintWriter.java:623)
at java.io.PrintWriter.write(PrintWriter.java:601)
at java.io.PrintWriter.write(PrintWriter.java:579)
at java.io.PrintWriter.write(PrintWriter.java:660)
at java.io.PrintWriter.append(PrintWriter.java:722)
at java.io.PrintWriter.append(PrintWriter.java:691)
at java.io.PrintWriter.append(PrintWriter.java:31)
at java.lang.Throwable.printStackTrace(Throwable.java:315)
at java.lang.Throwable.printStackTrace(Throwable.java:300)
at anywheresoftware.b4a.BA.printException(BA.java:262)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:191)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:157)
at anywheresoftware.b4a.BA.raiseEvent(BA.java:153)
at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:78)
at android.view.View.performClick(View.java:5698)
at android.widget.TextView.performClick(TextView.java:10846)
at android.view.View$PerformClick.run(View.java:22565)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7230)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Me pierdo (Que inútil soy).
 

rscheel

Well-Known Member
Licensed User
Longtime User
Lo mas recomendable es que guardes el nombre y la ruta de la imagen, la imagen puede quedar guardada en alguna carpeta en el teléfono, si necesitas luego sincronizar esos datos a un servidor la imagen la puedes subir por ftp.
 

JMMF

Member
Licensed User
Longtime User
Gracias rscheel.
Perdona mi ignorancia
pero si guardo los JPG; ¿no ocupan mucho espacio?
y si los subo necesito conectarme.
No considero una buena solución.
De todas las maneras gracias.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Puedes probar en PNG y bajandole la resolucion al 20% por ejemplo.
Yo lo hice en una de mis aplicaciones y, al ser no muy grande la imagen q necesitaba mostrar apenas se notaba la diferencia de calidad.
Un saludo.
 

rscheel

Well-Known Member
Licensed User
Longtime User
Gracias rscheel.
Perdona mi ignorancia
pero si guardo los JPG; ¿no ocupan mucho espacio?
y si los subo necesito conectarme.
No considero una buena solución.
De todas las maneras gracias.

Bueno es cosa tuya, según mi punto de vista lo que no es recomendable es guardar las fotos en la bd, y como dice @Descartex depende en que formato subas la imagen.
 

JMMF

Member
Licensed User
Longtime User
Gracias por vuestros comentarios.

Ya que me cometáis que no es buena opción el guardar las imágenes en la BD, probare como me cometáis con ficheros PNG reducidos, en una carpeta del teléfono.

Un saludo, y os comento que tal.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Nunca me gustó trabajar con Blobs, con lo cual es mucho más sencillo guardar la ruta como string y luego acceder a ella. Otra cosa es que el usuario la borre, pero eso ya se escapa a nuestro control.
Una BD que almacene imágenes, es ingobernable, lenta, pesada y latosa.
Un saludo.
 

JMMF

Member
Licensed User
Longtime User
Pues funciona bien.

Necesito realizar un poco mas de código para guardar los PNG, pero genial.

Pero Sres. Sigo viendo la imagen en horizontal en el ImageView .

Y si no es mucho pedir, es posible un ZUM.
 
Last edited:

JMMF

Member
Licensed User
Longtime User
Gracias Ciclope3160, por la aportación
Ya estoy trabajando con esta librería en relación de el zum, y lo que tu dices "funciona muy bien".
Tema ZUM [SOLUCIONADO].
Pero no consigo girarrrrrrrrrrrrr la imagen.
 

JMMF

Member
Licensed User
Longtime User
El que busca encuentra.

B4X:
'El resultado llega aquí
Sub ion_Event (MethodName As String, Args() As Object) As Object
    If Args(0) = -1 Then
        Try
            If File.Exists(Main.Ruta, "Nuevo.PNG") Then
                Main.lastPicture.InitializeSample(Main.Ruta,"Nuevo.PNG",Pnl01.Width,Pnl01.Height)
                File.Delete(Main.Ruta, "Nuevo.PNG")
                    Dim canvas1 As Canvas
                Dim Rect1 As Rect
                Dim rotDiff As Int
                    Dim startL, startT, startR, startB As Int
                    rotDiff = (TouchImageView2.Height - TouchImageView2.Width)/2
                    startL = -rotDiff
                    startT = rotDiff
                    startR = TouchImageView2.Width + rotDiff
                    startB = TouchImageView2.Height - rotDiff
                canvas1.Initialize(TouchImageView2)
                Rect1.Initialize(startL, startT, startR, startB)
                canvas1.DrawBitmapRotated(Main.lastPicture,Null,Rect1,90)'gira la imagen 90º
                Main.lastPicture = canvas1.Bitmap
               
                Dim out As OutputStream
                  out = File.OpenOutput(Main.Ruta ,"Nuevo.PNG", False)
                  Main.lastPicture.WriteToStream (out,25,"PNG")
                  out.Close
                Main.lastPicture.InitializeSample(Main.Ruta,"Nuevo.PNG",Pnl01.Width,Pnl01.Height)
                File.Delete(Main.Ruta, "Nuevo.PNG")

                TouchImageView1.SetBitmap(Main.lastPicture)
                TouchImageView1Posicion
            End If
            Main.CreaFoto = True
        Catch
            Log(LastException)
        End Try
    Else
        Main.CreaFoto = False
    End If
    If Main.lastPicture.IsInitialized Then TouchImageView1.SetBitmap(Main.lastPicture)
    Return Null
End Sub
No sé si es la mejor forma de girar una imagen

Pero a mí me funciona

Yupi. Solucionado.
 
Top