Italian SignatureCapture : file troppo grande.

Star-Dust

Expert
Licensed User
Longtime User
Prova questo (necessita della libreria Reflection)
B4X:
Sub CreateScaledBitmap(Original As Bitmap, Width As Int, Height As Int) As Bitmap
    Dim r As Reflector
    Dim Filter As Boolean =False
    Dim b As Bitmap
    b = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
        Array As Object(Original, Width, Height, Filter), _
        Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
    Return b
End Sub
 
Last edited:

luciano deri

Active Member
Licensed User
Longtime User
Mi piacerebbe avere una riduzione proporzionale su entrambe le dimensioni, non è che con width e height rischio di deformarla?
 

Star-Dust

Expert
Licensed User
Longtime User
Se le dimensioni (altezza e largherzza) le mantieni proporzionate l'immagine non si deforma, comunque per aiutarti ancora...con questo codice mantieni le proporzioni
B4X:
CreateScaledBitmapPercentual(Imagine, 30) ' ridotta al 30%

Sub CreateScaledBitmapPercentual(Original As Bitmap,Percentual As Int) As Bitmap
    Dim r As Reflector
    Dim Filter As Boolean = False
    Dim b As Bitmap
    Dim Width As Int = Original.Width * (Percentual /100)
    Dim Height As Int = Original.Height * (Percentual /100)
 
    b = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
        Array As Object(Original, Width, Height, Filter), _
        Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
    Return b
End Sub

Poi su B4A 7.30 già esiste una funzione che fa questo lavoro e se vuoi rispetta le proporzioni. Io ho B4A6.5 quindi non lo uso
B4X:
Dim B As Bitmap
 
Din New as Bitmap = B.Resize(Width,Heigth, True) ' True per mantenere le proporzioni

fai sapere se sei riuscito o meglio buttarmi una decina di like :D
 
Last edited:

luciano deri

Active Member
Licensed User
Longtime User
Ho fatto in questo modo. Grazie
B4X:
sz = File.Size(Main.Pthdoc,str)
Do While (sz >= 100000 ) ' maggiore di 100 k
        sz = File.Size(Main.Pthdoc,str)
        Log(sz)
        Dim img As Bitmap
        Dim Out As OutputStream
        img.Initialize(Main.Pthdoc,str)
        img = CreateScaledBitmap(img,img.Width*0.1,img.Height*0.1)
        Out = File.OpenOutput(Main.Pthdoc,str, False)
        img.WriteToStream(Out, 100, "PNG")
        Out.Close
    Loop

    Do While (sz > 10000 ) '10 k
       
        Log(sz)
        Dim img As Bitmap
        Dim Out As OutputStream
        img.Initialize(Main.Pthdoc,str)
        img = CreateScaledBitmap(img,img.Width*0.9,img.Height*0.9)
        Out = File.OpenOutput(Main.Pthdoc,str, False)
        img.WriteToStream(Out, 100, "PNG")
        Out.Close
    Loop
In questo modo riesco ad avere immagini di poco meno di 0 k
 

Star-Dust

Expert
Licensed User
Longtime User
Mi sembra troppo macchinoso salvare ogni volta per sapere se il pe so del file non superi i Kb di limite.

Oltretutto che il continuo salvataggio richiede tempo, il tutto si rallenterà e nel peggiore delle ipotesi non usando il metodo asincrono si sovrapporra.

Credo tu debba usare una.soluzione migliore. Che fra l'altro non è difficile da ideare
 

luciano deri

Active Member
Licensed User
Longtime User
Lo so ma non ho trovato un modo più rapido che capire se la dimensione del file supera quel limite. Bisognerebbe che avessi la proprietà size sulla variabile Bitmap.
 

Star-Dust

Expert
Licensed User
Longtime User
Lo so ma non ho trovato un modo più rapido che capire se la dimensione del file supera quel limite. Bisognerebbe che avessi la proprietà size sulla variabile Bitmap.

B4X:
Sub GetBitmapSizeinBytes (myBitmap As Bitmap) As Int
    Dim ByteCount As Int
    Dim jo As JavaObject = myBitmap
    Dim joSDK As JavaObject
       joSDK.InitializeStatic("android.os.Build.VERSION")
        If joSDK.GetField("SDK_INT") >= 19 Then  'kitkat
            ByteCount = jo.RunMethod("getAllocationByteCount", Null)
        else if joSDK.GetField("SDK_INT") >= 12 Then   'Android 3.1 Honeycomb
            ByteCount = jo.RunMethod("getByteCount", Null)
        Else     'earlier Android versions
            ByteCount = jo.RunMethod("getRowBytes", Null) * myBitmap.Height

            'the code below could replace the formula above for earlier Android versions
           'ByteCount = myBitmap.Width * myBitmap.Height * 4                                             
        End If
    Return ByteCount
End Sub

ma il resto fallo tu oppure mi dai una percentuale sugli utili :p
 

Star-Dust

Expert
Licensed User
Longtime User
In ogni caso non c'é bisogno di usare un ciclo While per trovare la dimensione inferiore al limite. E' inutile e e lento.

Ecco un codice che ti ridimensiona correttamente in base al limite stabilito.

B4X:
Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")
    Dim B As Bitmap = LoadBitmap(file.DirAssets,"test.png")
    Dim Size As Int = GetBitmapSizeinBytes(B)
    Dim Percent10k As Float =     Sqrt(10240/Size) '10k
    Dim Percent100k As Float =     Sqrt(100240/Size) '100k
  
    If Percent10k<1 Then B=CreateScaledBitmap(B,B.Width*Percent10k,B.Height*Percent10k)
End Sub

Sub GetBitmapSizeinBytes (myBitmap As Bitmap) As Int
    Dim ByteCount As Int
    Dim jo As JavaObject = myBitmap
    Dim joSDK As JavaObject
    joSDK.InitializeStatic("android.os.Build.VERSION")
    If joSDK.GetField("SDK_INT") >= 19 Then  'kitkat
        ByteCount = jo.RunMethod("getAllocationByteCount", Null)
    else if joSDK.GetField("SDK_INT") >= 12 Then   'Android 3.1 Honeycomb
        ByteCount = jo.RunMethod("getByteCount", Null)
    Else     'earlier Android versions
        ByteCount = jo.RunMethod("getRowBytes", Null) * myBitmap.Height

        'the code below could replace the formula above for earlier Android versions
        'ByteCount = myBitmap.Width * myBitmap.Height * 4
    End If
    Return ByteCount
End Sub

Sub CreateScaledBitmap(Original As Bitmap, Width As Int, Height As Int) As Bitmap
    Dim r As Reflector
    Dim Filter As Boolean =False
    Dim b As Bitmap
    b = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
        Array As Object(Original, Width, Height, Filter), _
        Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
    Return b
End Sub

Per il posto di lavoro, abitiamo troppo distanti non credo si possa realizzare :p
 
Last edited:

Star-Dust

Expert
Licensed User
Longtime User
altro metodo

B4X:
Sub ResizeBitmapMaxByte(Original As Bitmap, MaxByte As Long) As Bitmap
    Dim ByteSize As Long
    Dim ObjectBitmap As JavaObject = Original
    Dim Api_Lelvel As JavaObject
   
    Api_Lelvel.InitializeStatic("android.os.Build.VERSION")
    If Api_Lelvel.GetField("SDK_INT") >= 19 Then  'kitkat
        ByteSize = ObjectBitmap.RunMethod("getAllocationByteCount", Null)
    else if Api_Lelvel.GetField("SDK_INT") >= 12 Then   'Android 3.1 Honeycomb
        ByteSize = ObjectBitmap.RunMethod("getByteCount", Null)
    Else     'earlier Android versions
        ByteSize = ObjectBitmap.RunMethod("getRowBytes", Null) * Original.Height
    End If
   
    Dim Ratio As Float =     Sqrt(MaxByte/ByteSize)
   
    If Ratio<1 Then
        Dim r As Reflector
        Dim b As Bitmap
        Dim Width As Int = (Original.Width*Ratio)
        Dim Height As Int = (Original.Height * Ratio)
   
        b = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
            Array As Object(Original, Width , Height, False), _
            Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
        Return b
    Else
        Return Original
    End If
End Sub
 
Top