BITMAPINFOHEADER中biSizeImage的计算方法


bmp图片的格式规定一个扫描行所占的字节数必须是4的倍数,不足的以0填充,
可是我就不明白这个式子是怎么推出来的:DataSizePerLine= (biWidth* biBitCount+31)/32*4;
另外这个又怎么理解:((((biWidth * biBitCount) + 31) & ~31) >> 3)

 

((((biWidth * biBitCount) + 31) & ~31) >> 3)
这个也一样嘛先补充(biWidth * biBitCount) + 31,然后把后边5位(2进制表示)置0,这样就可以被32整除了,而且得到的数不小于biWidth*biBitCount,再>>3得到的数就是被4整除的了.

就说说"~31"吧,31求反可得32位整数(2进制):
11111111111111111111111111100000B,任何会编程的人一看这个数就知道,用一个数(num)和它与(&)的话,后5位必定被它清0,而其它位没有变化,而一个重要的概念就是:
后5位清0想当于作了两次位移(假如无符号数没溢出的话,估计区区位图行字节数,怎么都不会溢出的吧):
num >>= 5;
num <<= 5;
没错,这基本上就是( num & ~31 )的操作,看出端倪没?
yes, num >>= 5 实际上就是除以32;而num <<= 5实际上就是乘以32,而>> 3实际上是除以8. (不明白的话请去翻书)
ok,整条公式已经可以简单转换为:
((((biWidth * biBitCount) + 31) / 32 * 32 ) / 8)
它和这个可以说没啥不同:
((((biWidth * biBitCount) + 31) / 32 ) * 4)
不信的话,求求就知道了...

我在网上搜到一个公式
biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight
不知道为啥加31

biSizeImage=(biWidth*biBitCount+31)/32*4*biHeight其中,biWidth*biBitCount是每一行图像占用的位数,除以8是每行图像占用的字节数,要为4的整数倍,所以除以32再乘以4
31是按整数除法自动取整的原则来的,其保证每行图像字节数必须是4的整倍数!
举一个例子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个字节加7位,因为字节数必须是4的整倍数,所以应该是4。所以补齐时需要加上4个字节数即32位

(biWidth* biBitCount+31)/32*4这是整形的除法,只返回整数。
如果biWidth* biBitCount不是32的整数倍,那么最多差31。
比如biWidth* biBitCount = 55,加9为64,就是8个字节了。31还剩余23的除32是0.不起作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值