自学图形图像设计,遇到的问题是看不懂求图像每行的字节数,请指教~

aicro 2008-04-01 09:28:00
我看得书上有如下代码
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数吗?

先谢过!
...全文
44 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrisemaple 2008-04-02
  • 打赏
  • 举报
回复
前提: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++;


aicro 2008-04-02
  • 打赏
  • 举报
回复
是不是while((dwWidthBytes & 3) != 0)dwWidthBytes++;做到了“BMP图像要求每行像素点的字节数为4的整数倍”?这句话什么意思啊,怎么做位与阿,是不是将dwWidthBytes代表的数字的ascii与3的ascii作比较?这样有什么意义?
aicro 2008-04-02
  • 打赏
  • 举报
回复
我初学,还是不太明白,能否详细一点。比如我觉得if(byBitCount == 1) dwWidthBytes = (nWidth) / 8; 再结合while((dwWidthBytes & 3) != 0)dwWidthBytes++;不就可以了吗,为什么要如原来这样的作。谢谢
laoma_hbu 2008-04-01
  • 打赏
  • 举报
回复
BMP图像要求每行像素点的字节数为4的整数倍
对于BMP图像,每行像素占的字节数可以
写成dwWidthBytes = (nWidth * byBitCount+31)/32*4;
rover___ 2008-04-01
  • 打赏
  • 举报
回复
建议看MSDN中对BitmapInfoHeader结构的说明。那就是依据。
上面的计算无非从结构中取位图尺寸。byBitCount (bits per pixel
)值计算一个扫描行象素占用空间大小。(好象已经考虑到了PADDING的情况)
相关推荐
发帖
图形处理/算法

1.9w+

社区成员

VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
帖子事件
创建了帖子
2008-04-01 09:28
社区公告
暂无公告