Input: B4XBitmap / Bitmap / Image
Output: array of bytes with the BMP format
Depends: XUI, BitmapCreator, RandomAccessFile (all internal libraries)
Usage example:
Output: array of bytes with the BMP format
Depends: XUI, BitmapCreator, RandomAccessFile (all internal libraries)
B4X:
Sub BitmapToBMP (img As B4XBitmap) As Byte()
Dim Padding As Int = 4 - ((img.Width * 3) Mod 4)
If Padding = 4 Then Padding = 0
Dim HeaderSize As Int = 40
Dim offset As Int = HeaderSize + 14
Dim size As Int = offset + img.Width * img.Height * 3 + img.Height * Padding
Dim raf As RandomAccessFile
Dim buffer(size) As Byte
raf.Initialize3(buffer, True)
raf.WriteBytes(Array As Byte(Asc("B"), Asc("M")), 0, 2, raf.CurrentPosition)
raf.WriteInt(size, raf.CurrentPosition)
raf.CurrentPosition = raf.CurrentPosition + 4
raf.WriteInt(offset, raf.CurrentPosition)
raf.WriteInt(HeaderSize, raf.CurrentPosition)
raf.WriteInt(img.Width, raf.CurrentPosition)
raf.WriteInt(img.Height, raf.CurrentPosition)
raf.WriteShort(1, raf.CurrentPosition)
raf.WriteShort(24, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
raf.WriteInt(0, raf.CurrentPosition)
Dim bc As BitmapCreator
bc.Initialize(img.Width, img.Height)
bc.CopyPixelsFromBitmap(img)
Dim a As ARGBColor
For y = bc.mHeight - 1 To 0 Step -1
For x = 0 To bc.mWidth - 1
bc.GetARGB(x, y, a)
raf.WriteByte(a.b, raf.CurrentPosition)
raf.WriteByte(a.g, raf.CurrentPosition)
raf.WriteByte(a.r, raf.CurrentPosition)
Next
For i = 0 To Padding - 1
raf.WriteByte(0, raf.CurrentPosition)
Next
Next
raf.Close
Return buffer
End Sub
Usage example:
B4X:
Dim b() As Byte = BitmapToBMP(xui.LoadBitmap(File.DirAssets, "smiley.png"))
File.WriteBytes("C:\Users\H\Downloads", "test.bmp", b)