WINDOWS BMP图片的诡异 (疑惑)

      在做自己的GUI时,鼠标指针使用bmp图片。一开始32x32,太大了,改为16x16,一切OK。但后来感觉再改小点会不会更好,于是裁剪到10x16,一测出现问题了,鼠标变了。我怀疑是代码中width和height有还没更新的地方。于是全部使用全局变量的ms_w、ms_h来代替,再测试,还是一样。

      怀疑是图片的问题,仍使用16x16的,一切依然OK。再切换为10x16,又是那样。于是,再裁剪为10x14,仍是那样的问题。

      好吧,看看BMP图片的数据,看看哪里不对。

看属性:

WINDOWS BMP图片的诡异 (疑惑)_第1张图片

      哎,一算,不对啊,这么奇怪?

WINDOWS BMP图片的诡异 (疑惑)_第2张图片

     于是,百度了下BMP格式

http://baike.baidu.com/link?url=NNWmHtYqdmIaWdhWBt7pPpaKzPKLak-msmNoYrgzXPu6g_SVE6I9rmYOlxK5DmtiSS0dYa3EDG5PywoiqqjFgIQNXjsSqpHVR3Vnh2on6x3

      位图一共有两种类型,即:设备相关位图(DDB)和设备无关位图(DIB)。我是用windows自带的画图截出来的,再保存为BMP,24bit是DIB类型,从底向上显示。

      真彩色图(24位的BMP)就不需要调色板,在24位图中直接使用RGB。

      Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
      10像素一行,共10 x (24 / 8) = 30字节,4的倍数,32, 还得补2字节。
      重新计算一下: 14 + 40 + (10 x (24 / 8) + 2)x 14 = 54 + 32 x 14 = 502字节,怎么会是504字节的?
      查看下十六进制数据:     

      1f8h = 504字节,数据是有的,再看,发现多的是最后两字节数据,同时可以看到有四行后面填充的并不是0x00,而是其他数据

0X7B 0X0C

0X31 0X2E

0X4B 0X4F

0X5C 0X4C

多了最后两字节0x00 0x00。

      说明WINDOWS自身的画图软件也是那么不靠谱的!


      不过我那个鼠标不正常显示是我忽略了windows的不足4的倍数时补为4的倍数。

你可能感兴趣的:(WINDOWS BMP图片的诡异 (疑惑))