Android Question How to compress images in ImageView1 to below 600KB?

Erel

B4X founder
Staff member
Licensed User
Longtime User
B4X:
Private Sub ResizeImageBasedOnMaxFileSize (Img As B4XBitmap, MaxSize As Long, OutputFolder As String, OutputFile As String)
    Dim Quality As Int = 100
    Dim Size As Long = MaxSize + 1
    Do While Size > MaxSize And Quality >= 10
        Dim out As OutputStream = File.OpenOutput(OutputFolder, OutputFile, False)
        Img.WriteToStream(out, Quality, "JPEG")
        out.Close
        Size = File.Size(OutputFolder, OutputFile)
        Log($"Quality: ${Quality}%, Size: $1.0{Size / 1024}kb"$)
        Quality = Quality - 5
    Loop
End Sub

Usage example:
B4X:
ResizeImageBasedOnMaxFileSize(xui.LoadBitmap(File.DirAssets, "2.jpg"), 600 * 1024, xui.DefaultFolder, "2.jpg")
 
Upvote 0

bskotu555

Active Member
B4X:
Private Sub ResizeImageBasedOnMaxFileSize (Img As B4XBitmap, MaxSize As Long, OutputFolder As String, OutputFile As String)
    Dim Quality As Int = 100
    Dim Size As Long = MaxSize + 1
    Do While Size > MaxSize And Quality >= 10
        Dim out As OutputStream = File.OpenOutput(OutputFolder, OutputFile, False)
        Img.WriteToStream(out, Quality, "JPEG")
        out.Close
        Size = File.Size(OutputFolder, OutputFile)
        Log($"Quality: ${Quality}%, Size: $1.0{Size / 1024}kb"$)
        Quality = Quality - 5
    Loop
End Sub

Usage example:
B4X:
ResizeImageBasedOnMaxFileSize(xui.LoadBitmap(File.DirAssets, "2.jpg"), 600 * 1024, xui.DefaultFolder, "2.jpg")
How to determine if the selected image volume is greater than 600KB?
 
Upvote 0

bskotu555

Active Member
B4X:
Private Sub ResizeImageBasedOnMaxFileSize (Img As B4XBitmap, MaxSize As Long, OutputFolder As String, OutputFile As String)
    Dim Quality As Int = 100
    Dim Size As Long = MaxSize + 1
    Do While Size > MaxSize And Quality >= 10
        Dim out As OutputStream = File.OpenOutput(OutputFolder, OutputFile, False)
        Img.WriteToStream(out, Quality, "JPEG")
        out.Close
        Size = File.Size(OutputFolder, OutputFile)
        Log($"Quality: ${Quality}%, Size: $1.0{Size / 1024}kb"$)
        Quality = Quality - 5
    Loop
End Sub

Usage example:
B4X:
ResizeImageBasedOnMaxFileSize(xui.LoadBitmap(File.DirAssets, "2.jpg"), 600 * 1024, xui.DefaultFolder, "2.jpg")

Private Sub Button1_Click
CC.Show("image/*", "Choose image")
'CC.Show("audio/*", "Choose audio file")
End Sub

Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
If Success = True Then
Dim pic As String=Dir &"\" & FileName
If pic.size>600KB Then
ResizeImageBasedOnMaxFileSize(pic, 600 * 1024, xui.DefaultFolder, FileName)
End If
ImageView1.Bitmap = LoadBitmap(xui.DefaultFolder,FileName)
Else
ToastMessageShow("No Success :(",True)
End If
End Sub
 
Upvote 0

bskotu555

Active Member
B4X:
Private Sub ResizeImageBasedOnMaxFileSize (Img As B4XBitmap, MaxSize As Long, OutputFolder As String, OutputFile As String)
    Dim Quality As Int = 100
    Dim Size As Long = MaxSize + 1
    Do While Size > MaxSize And Quality >= 10
        Dim out As OutputStream = File.OpenOutput(OutputFolder, OutputFile, False)
        Img.WriteToStream(out, Quality, "JPEG")
        out.Close
        Size = File.Size(OutputFolder, OutputFile)
        Log($"Quality: ${Quality}%, Size: $1.0{Size / 1024}kb"$)
        Quality = Quality - 5
    Loop
End Sub

Usage example:
B4X:
ResizeImageBasedOnMaxFileSize(xui.LoadBitmap(File.DirAssets, "2.jpg"), 600 * 1024, xui.DefaultFolder, "2.jpg")
B4A:
Private Sub Button1_Click
    CC.Show("image/*", "Choose image")
    'CC.Show("audio/*", "Choose audio file")
End Sub

Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
    If Success = True Then
        Dim pic As String=Dir & "/" & FileName
        Dim ImagePath As String = pic
        If IsImageLargerThanTargetSize(ImagePath, TargetSize) Then' 判断图片是否大于 600KB
            ResizeImageBasedOnMaxFileSize(pic, 600 * 1024, xui.DefaultFolder, FileName)
            ImageView1.Bitmap = LoadBitmap(xui.DefaultFolder,"compressed_image.jpg")
        Else
            ImageView1.Bitmap = LoadBitmap(Dir, FileName)
        End If
    Else
        ToastMessageShow("No Success :(",True)
    End If
End Sub

Private Sub IsImageLargerThanTargetSize(ImagePath As String, TargetSize As Int) As Boolean
    Dim FileSize As Long = File.Size(File.DirInternal, ImagePath)
    If FileSize > TargetSize Then
        Return True
    Else
        Return False
    End If
End Sub

Private Sub ResizeImageBasedOnMaxFileSize (Img As B4XBitmap, MaxSize As Long, OutputFolder As String, OutputFile As String)'图片压缩算法
    Dim Quality As Int = 100
    Dim Size As Long = MaxSize + 1
    Do While Size > MaxSize And Quality >= 10
        Dim out As OutputStream = File.OpenOutput(OutputFolder, OutputFile, False)
        Img.WriteToStream(out, Quality, "JPEG")
        out.Close
        Size = File.Size(OutputFolder, OutputFile)
        Log($"Quality: ${Quality}%, Size: $1.0{Size / 1024}kb"$)
        Quality = Quality - 5
    Loop
End Sub
There are two errors inside, I don't know how to modify them...
error:
B4XMainPage - 65: Parameter name cannot hide global variable name.
B4XMainPage - 55: type mismatch。 (warning #22)
 
Upvote 0
Top