最近在处理BMP的图片显示,关于BMP的文件数据头,就不多解释了。。
网上随便找一下都是一大堆。
我想记录一下bmp的补齐原则。
关于这张图片,尺寸是这样的:
38 * 25
262 个字节
里面的位图深度是1位单色
使用emwin的图片,转换的图片是这样的。
static GUI_CONST_STORAGE unsigned char acconvert1[] = {
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX__,
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX__,
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX__,
XX______, ________, ________, , XXXXX,
X, ________, ________, ________, _XXX,
________, ________, , , XXX,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXX,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X__XXX,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X__XXX,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X____X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X,
_XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X__XXX,
_XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, X__XXX,
___XXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, _XXX,
________, ________, ________, __, XXX,
X, ________, ________, ___, XXX,
XX, ________, ________, _, XXXXX,
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX,
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX,
XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXXXX, XXXXXX
};
GUI_CONST_STORAGE GUI_BITMAP bmconvert1 = {
38, /* XSize /
25, / YSize /
5, / BytesPerLine /
1, / BitsPerPixel /
acconvert1, / Pointer to picture data (indices) /
&Palconvert1 / Pointer to palette */
};
可以看到BytesPerLine 是5,大小是38 * 25 这都是没问题的。
如果直接将BMP图片放入2进制位图,可以看到:
数据 bmp是以 42 4D 开头的。前面的62个字节 是图片数据。后面的200的字节是位图数据。
这时候就有个问题了。
用emwin的图片转化器形成的数据大小是: 5 * 25 = 125 的字节
可是window7的数据字节确实: 200!
那丢失的75个数据去哪里了呢????
究竟数据发生了什么填补?
{BMP如果未经过emwin的转换软件的在windows会用0补齐。补齐的方式是2的次方形式。
2 4 8 16 32 64 128
}
然后擅自改动位图的BytesPerLine 是否会影响内存的显示呢?
实验证明是不影响的,也见证了emwin的强大之处。