六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 29|回复: 0

BITMAPINFOHEADER.biSizeImage

[复制链接]

升级  47.05%

629

主题

629

主题

629

主题

探花

Rank: 6Rank: 6

积分
1941
 楼主| 发表于 2013-2-7 03:28:58 | 显示全部楼层 |阅读模式
typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize;
  LONG   biWidth;
  LONG   biHeight;
  WORD   biPlanes;
  WORD   biBitCount;
  DWORD  biCompression;
  DWORD  biSizeImage;
  LONG   biXPelsPerMeter;
  LONG   biYPelsPerMeter;
  DWORD  biClrUsed;
  DWORD  biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

  以上是位图(Bitmap)结构中的一个重要部分:BITMAPINFOHEADER,其中 biSizeImage 如果不为 0 这代表位图中实际的像素数据字节数,同时位图像素数据的字节数也可以通过 biWidth biHeight biBitCount 计算得到。按照道理讲,如果指定了这个成员,那么它的值应该和计算所得是一致的。但是我在实际使用中发现,某些软件(比如 Photoshop[的某个版本?])生成的位图文件指定了这个值但是和计算所得并不一致(大),同时位图像素数据部分的末尾会添加相应字节的对齐数据(我猜想是为了对齐到 4 字节边界)。
  对于这种情况,我们要如何处理呢?如果你仅仅是为了显示一副这样的“非标准”BMP 而你所使用的类库(函数库)恰好不能处理这样的格式,最简单的处理方案就是用 Windows 自带的《画图》把此图片稍作修改(其实只是让《画图》认为你做了修改就可以了,比如在某个点上使用铅笔工具用相同的颜色再点一下即可)然后重新保存一下就可以了。如果你自己就是类库(函数库)的作者,那么请留意这种情况的可能性。特别是配合 CreateDIBSection 使用并且让 CreateDIBSection 替你分配内存的话,那么请注意它替你分配的内存的长度是通过 biWidth biHeight biBitCount 计算得到,而不是 biSizeImage 指定的值,所以在后续的内存读写时注意不要越界。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表