我是靠谱客的博主 还单身雨,最近开发中收集的这篇文章主要介绍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.不起作用。

 

 

最后

以上就是还单身雨为你收集整理的BITMAPINFOHEADER中biSizeImage的计算方法的全部内容,希望文章能够帮你解决BITMAPINFOHEADER中biSizeImage的计算方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部