我看得书上有如下代码
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数吗?先谢过!
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数吗?先谢过!
上面的计算无非从结构中取位图尺寸。byBitCount (bits per pixel
)值计算一个扫描行象素占用空间大小。(好象已经考虑到了PADDING的情况)
对于BMP图像,每行像素占的字节数可以
写成dwWidthBytes = (nWidth * byBitCount+31)/32*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++;