The "output5.bmp" is a regular BMP format file. 176x264 1BPP i.e. 1-bit colour (monochrome).
It contains its own colour Palette. You can edit the Palette in IrfanView. Currently Index:0=WHITE, 1=BLACK
Most BMP programs on Arduino only render 24-bit colour BMP files.
I provide an example that will render BMP files with 1BPP, 4BPP, 8BPP, 16BPP, 24BPP
Although your image is only 1 bit deep, the individual Palette colours can be chosen from a 16M Colour Palette (24-bits).
Obviously how accurate the colours are on your TFT depend on the TFT resolution (16-bits or 18-bits)
David.
OOPS. I was replying to a TFT colour display question. When you are using a monochrome display.
Since your EPaper device can only render BLACK or WHITE it will ignore most of the 24-bits in a Palette Entry.
Edit. I looked at the drawBitmapFromSpiffs() function from #0
It seems to support all the same BMP formats that I do.
It understands Palettes. It should display BLACK and WHITE properly.
The header size is always 54.
If there is a Palette, it follows the Header.
From IrfanView: output5.bmp has Palette 255:255:255 , 000:000:000 i.e. WHITE,BLACK
I have some x1 bitmaps e.g. truck.bmp
betty_4.bmp is a 4BPP image i.e. 16 colours.
You should be able to examine the Palette in IrfanView.
Likewise, you can take a 24BPP colour JPG, PNG, BMP and reduce it to 8BPP (256 colours) quite well.
Reducing to 4BPP or 1BPP requires a bit of skill. IrfanView does a pretty good job but 1BPP is very difficult to get the "best" look.
I suggest that you look very carefully at your Palette. I would calculate the Palette once. Then you render each pixel directly from the Palette.
My apologies. I copied output5.bmp to an SD. Then displayed via an ESP8266.
It shows as Yellow graphics on a Red background.
I will check my algorithm.
I changed the Palette in IrfanView to give Blue graphics on a Cyan background.
This renders fine.
I will have to compare the file contents. But this will be later this afternoon.
Why don't I get 255 255 255 and 0 0 0, as I would expect from info of IrfanView?
but 255 0 0 and 0 255 0 instead?
Ah-ha. My display must be GREEN graphics on Red background. Not Yellow.
So the algorithm is correct. I must see why IrfanView is different to ImageMagick.
You can see the colorsimportant field at offset 0x0032 means that the Palette uses a different format. i.e. Palette is @ 0x007A [FF FF FF 00] [00 00 00 00] White-Black
The IrfanView Palette is @ 0x0036 [FF FF 00 00] [FF 00 00 00] Cyan-Blue
Here is a Wikipedia article that describes the BMP file format
I suspect that ImageMagick can generate both formats. I wonder whether it is worth the effort to support the extra
An OS/2 2.x OS22XBITMAPHEADER (BITMAPINFOHEADER2 in IBM's documentation) contains 24 additional bytes
David.
p.s. I have just been listening to an excellent play on the Radio about Nikolai Gogol (my hero)
yes, I once had a look at that Wikipedia article, and decided it is too complicated for my practical use, and I stay with code that is widely used for Arduino libraries, e.g. the one I found in your library.
Do you have a practical suggestion how to deal with this for users of our libraries?
I downloaded ImageMagick, but I still need some time to learn how to use it.
Users like @rlightner and others could profit from a workaround.
The reason why I'm doing it the way I am is that the file encoded this way is only 7 kb, but with the other way, comes out to around 138 kb. I'm trying to minimize the sending over the wire to the device. If at the end of the day I just need to take the hit, I will.
I do appreciate all the work you guys have given to the community. It's a great building block for others to create upon!
You can see the colorsimportant field at offset 0x0032 means that the Palette uses a different format.
i.e. Palette is @ 0x007A [FF FF FF 00] [00 00 00 00] White-Black
The IrfanView Palette is @ 0x0036 [FF FF 00 00] [FF 00 00 00] Cyan-Blue
So you just have to read 0x32 and if 2 you seek to 0x007A instead of 0x0036
It should not be more than two lines. e.g.
if (bmpDepth <= PALETTEDEPTH) { // these modes have separate palette
bmpFile.seek(50); //colorsimportant
bmpFile.seek(read32() ? 122 : 54); //important or regular palette
If there are ImageMagick users out there, please could you try creating BMP with different colour depths.
IrfanView recognises the colorsimportant field but does not seem to generate it.
I will post the patch on the BMP examples on the MCUFRIEND_kbv Beta.
@rlightner,
you can edit the drawBitmapFromSpiffs() function in the sketch:
if (depth <= 8)
{
if (depth < 8) bitmask >>= depth;
//file.seek(54); //palette is always @ 54
file.seek(50); //colorsimportant
file.seek(read32() ? 122 : 54); //important or regular palette
Please test your existing file.
If all works ok, I would appreciate it if you go back to ImageMagick
See if you can start with a colour JPG and reduce colours to 256-colour, 16-colour, 2-colour BMP files.
It would be nice if you posted the result. e.g. attach the files in a ZIP