概述
地球人都知道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
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.不起作用。
最后
以上就是还单身雨为你收集整理的BITMAPINFOHEADER中biSizeImage的计算方法的全部内容,希望文章能够帮你解决BITMAPINFOHEADER中biSizeImage的计算方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复