我看得书上有如下代码
DWORD CDib::GetDibWidthBytes()
{
byBitCount=m_pBitmapInfoHeader->biBitCount;
LONG nWidth=m_pBitmapInfoHeader->biWidth;
dwWidthBytes = (DWORD)m_pBitmapInfoHeader->biWidth; //8-bits
if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;
while((dwWidthBytes & 3) != 0)dwWidthBytes++;
return dwWidthBytes;
}1。为什么不把 if(byBitCount == 8)  dwWidthBytes = (((wide * 8)+31)/32*4); 写进去,是一定要分类讨论,还是书上的失误?
2。为什么这些计算都那么复杂,有什么依据或者潜在的规则吗?而且我觉得当byBitCount == 8,横向的像素点的个数不就是横向的byte数吗?先谢过!

解决方案 »

  1.   

    建议看MSDN中对BitmapInfoHeader结构的说明。那就是依据。
    上面的计算无非从结构中取位图尺寸。byBitCount (bits per pixel
    )值计算一个扫描行象素占用空间大小。(好象已经考虑到了PADDING的情况)
      

  2.   

    BMP图像要求每行像素点的字节数为4的整数倍
    对于BMP图像,每行像素占的字节数可以
    写成dwWidthBytes = (nWidth * byBitCount+31)/32*4; 
      

  3.   

    我初学,还是不太明白,能否详细一点。比如我觉得if(byBitCount == 1) dwWidthBytes = (nWidth) / 8; 再结合while((dwWidthBytes & 3) != 0)dwWidthBytes++;不就可以了吗,为什么要如原来这样的作。谢谢
      

  4.   

    是不是while((dwWidthBytes & 3) != 0)dwWidthBytes++;做到了“BMP图像要求每行像素点的字节数为4的整数倍”?这句话什么意思啊,怎么做位与阿,是不是将dwWidthBytes代表的数字的ascii与3的ascii作比较?这样有什么意义?
      

  5.   

    前提:BMP图像要求每行像素点的字节数为4的整数倍
    1.以下代码先把各种情况(1,4,24)都转换为字节数的整数倍if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8; 
    else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2; 
    else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ; 2.经过第1步后,现在dwWidthBytes 是字节数的整数倍,下面这句话的条件(dwWidthBytes & 3)用来判断dwWidthBytes 是否是4的倍数(4的倍数二进制后两位一定都是0),如果不是就增加dwWidthBytes,直到dwWidthBytes是4的倍数为止,从而满足前提。 while((dwWidthBytes & 3) != 0)dwWidthBytes++;