Skip to content

Commit

Permalink
Updated Bitmap header
Browse files Browse the repository at this point in the history
Updated the Bitmap header to BITMAPINFOHEADER according to https://en.wikipedia.org/wiki/BMP_file_format#DIB_header_(bitmap_information_header)

Slightly improved, now with bitmap size in header. Updating the header was necessary as inserting the previous version inside a PDF document wasn't possible.
  • Loading branch information
Apflkuacha authored Jun 19, 2024
1 parent d7b9c81 commit 41fe20a
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions QRCoder/BitmapByteQRCode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public byte[] GetGraphic(int pixelsPerModule, byte[] darkColorRgb, byte[] lightC
List<byte> bmp = new List<byte>();

//header
bmp.AddRange(new byte[] { 0x42, 0x4D, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00 });
bmp.AddRange(new byte[] { 0x42, 0x4D, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00 });

//width
bmp.AddRange(IntTo4Byte(sideLength));
Expand All @@ -72,9 +72,10 @@ public byte[] GetGraphic(int pixelsPerModule, byte[] darkColorRgb, byte[] lightC

//header end
bmp.AddRange(new byte[] { 0x01, 0x00, 0x18, 0x00 });
bmp.AddRange(new byte[24]);

//draw qr code
for (var x = sideLength-1; x >= 0; x = x - pixelsPerModule)
for (var x = sideLength - 1; x >= 0; x = x - pixelsPerModule)
{
for (int pm = 0; pm < pixelsPerModule; pm++)
{
Expand All @@ -97,9 +98,12 @@ public byte[] GetGraphic(int pixelsPerModule, byte[] darkColorRgb, byte[] lightC
}
}

//finalize with terminator
bmp.AddRange(new byte[] { 0x00, 0x00 });

// write filesize in header
var bmpFileSize = IntTo4Byte(bmp.Count);
for (int i = 0; i < bmpFileSize.Length; i++)
{
bmp[2 + i] = bmpFileSize[i];
}
return bmp.ToArray();
}

Expand All @@ -125,9 +129,11 @@ private byte[] HexColorToByteArray(string colorString)
/// <returns>Returns the integer as a 4-byte array.</returns>
private byte[] IntTo4Byte(int inp)
{
byte[] bytes = new byte[2];
byte[] bytes = new byte[4];
unchecked
{
bytes[3] = (byte)(inp >> 24);
bytes[2] = (byte)(inp >> 16);
bytes[1] = (byte)(inp >> 8);
bytes[0] = (byte)(inp);
}
Expand Down

0 comments on commit 41fe20a

Please sign in to comment.