bitmap每行字节数搞不懂,急~~~

laozi888 2010-01-14 09:18:15
地球人都知道bmp图片的格式规定一个扫描行所占的字节数必须是4的倍数,不足的以0填充,
可是我就不明白这个式子是怎么推出来的:DataSizePerLine= (biWidth* biBitCount+31)/8;
另外这个又怎么理解:((((biWidth * biBitCount) + 31) & ~31) >> 3)

我数学不太好,。。。。。。。
谢谢大家!
...全文
276 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lambochan 2010-01-18
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100116/17/4590fdf6-91c7-49a6-a76f-fa3effbae759.html
gamedragon 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lsvine 的回复:]
引用 4 楼 heartofmaple 的回复:
((((biWidth * biBitCount) + 31) & ~31) >> 3)
这个也一样嘛,先补充(biWidth * biBitCount) + 31,然后把后边5位(2进制表示)置0,这样就可以被32整除了,而且得到的数不小于biWidth*biBitCount,再>>3得到的数就是被4整除的了.


然后把后边5位(2进制表示)置0 这个有必要吗?

自己瞎猜的 感觉 把倒数的4 5位置0 效果一样
[/Quote]
效果是一样。只不过置两个bit和置五个bit,都是一条指令,时间上没任何区别。
gamedragon 2010-01-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lsvine 的回复:]
引用 4 楼 heartofmaple 的回复:
((((biWidth * biBitCount) + 31) & ~31) >> 3)
这个也一样嘛,先补充(biWidth * biBitCount) + 31,然后把后边5位(2进制表示)置0,这样就可以被32整除了,而且得到的数不小于biWidth*biBitCount,再>>3得到的数就是被4整除的了.


然后把后边5位(2进制表示)置0 这个有必要吗?

自己瞎猜的 感觉 把倒数的4 5位置0 效果一样
[/Quote]
有必要,算一下就知道了。
gamedragon 2010-01-18
  • 打赏
  • 举报
回复
第一个式子是不对的,第二个才是对的。

4个字节每个字节8bit,总共32bit,+31再除8(整除,后面那个>>3也是一样的意思)

(0+31)/8 = 0,没问题
(1+31)/8 = 4,没问题,多一个bit就要多4个字节
...
(31+31)/8 = 7,出问题了,多出7个字节,不能被4整除
laozi888 2010-01-18
  • 打赏
  • 举报
回复
有谁明白的再给大伙解释一下哈~~~~~~~~~~~`
lsvine 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hard9999 的回复:]
(biWidth* biBitCount+31)/8
这是整形的除法,只返回整数。
如果biWidth* biBitCount不是32的整数倍,那么最多差31位。
比如biWidth* biBitCount = 55,加9为64,就是8个字节了。31还剩余23的除32是0.不起作用。

[/Quote]

正解 不过第二个确实不好理解
lsvine 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 heartofmaple 的回复:]
((((biWidth * biBitCount) + 31) & ~31) >> 3)
这个也一样嘛,先补充(biWidth * biBitCount) + 31,然后把后边5位(2进制表示)置0,这样就可以被32整除了,而且得到的数不小于biWidth*biBitCount,再>>3得到的数就是被4整除的了.
[/Quote]

然后把后边5位(2进制表示)置0 这个有必要吗?

自己瞎猜的 感觉 把倒数的4 5位置0 效果一样
heartofmaple 2010-01-15
  • 打赏
  • 举报
回复
((((biWidth * biBitCount) + 31) & ~31) >> 3)
这个也一样嘛,先补充(biWidth * biBitCount) + 31,然后把后边5位(2进制表示)置0,这样就可以被32整除了,而且得到的数不小于biWidth*biBitCount,再>>3得到的数就是被4整除的了.
aaaa3105563 2010-01-14
  • 打赏
  • 举报
回复
up
hard9999 2010-01-14
  • 打赏
  • 举报
回复
(biWidth* biBitCount+31)/8
这是整形的除法,只返回整数。
如果biWidth* biBitCount不是32的整数倍,那么最多差31位。
比如biWidth* biBitCount = 55,加9为64,就是8个字节了。31还剩余23的除32是0.不起作用。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧