在MSDN中
BITMAPINFOHEADER的biSize 
Specifies the number of bytes required by the structure. 
这段话的意思是不是说这个biSize是该结构的大小?
如果是这个意思的话,那么用PhotoShop7.0.1创建一个16bpp的位图,设置格式为A1R5G5B5.
读入这个位图,则会发现BiSize为56,而不是BITMAPINFOHEADER的40大小
而且WinXp自带的图片传真查看器无法查看该图片。但是MSPAINT.exe可以打开这个图片所以想问问BiSize到底指的是什么!?40+4*4(掩码)==56

解决方案 »

  1.   

    具我所知就是sizeof(BITMAPINFOHEADER)
    GZ
      

  2.   

    如果就是sizeof(BITMAPINFOHEADER),那么这个用PhotoShop创建出来的文件就有问题了!
    不过还是有很多程序可以打开这个图片的
    除了ACDSee, winxp的图片查看器
      

  3.   

    这个我是知道的!
    但问题就是这个BiSize到底是什么DD呢?
      

  4.   

    执著。这个冬冬就是BITMAPINFOHEADER的大小。你要想写一个兼容性很强的BMP解析器,就不要过于相信该值(认为它必须等于40)。有的解析器会判断该值来确定图像类型的正确性,就像ACDSee, winxp的图片查看器等,好处是严格了,不会随意打开不合法的图片,坏处是兼容性差了,有些可以看的图片打不开。
    类似的值还有biPlanes,biBitCount。
    一般biPlanes必须等于1,但也有等于2或3的,而真正的位深为biPlanes*biBitCount
    biBitCount也有时并不是2的幂值,比如等于3,那表示了所用的颜色数,而你要做的就是把它修正为4,等等。有些问题,执著是好事,但要知道什么是重要的。你能写一个尽可能打开能够打开的图像的解析器就对了,其他问题不重要。
      

  5.   

    补充一点,有的BMP数据结构中有些值之所以不是我们通常认为的值,是因为不同的解析器作者对值得意义作了扩充,但基本没有破坏原结构,也没有随意扩充已定义的值的意义。比如上面说的56,因为带淹码的图像在BITMAPINFOHEADER后面还有4*4的淹码值,然后才是光栅数据,所以可以将4*4的值看作BITMAPINFOHEADER的一部分,而将这个偏移写到BiSize中。运用的时候,就可以很方便的定位光栅数据起始点了。当然这样一来,谁这样写的,谁才能直接明白BiSize代表什么。第三方程序打不开这样的图像实在很正常。