概述
- int imgBuffSize = (m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight;
图像的像素占的字节数为4的整数倍。
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
一个扫描行所占的字节数计算方法:
我们后面定义了一个宏
每一行的字节数必须是4的整倍数,只要调用
就能完成这一换算。
和我们设想的一样。
一个根据位图的每行像素点数和位数计算每行字节数的公式,为什么这样计算?
(mImageWidth * (mImageBitCount / 8) + 3) & ~3;
mImageWidth 位图宽度
mImageBitCount 位图的点位数
8bit占一个字节,图像每行的字节数必须是4的倍数,
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)这个公式是经常用的
-----------------------------------------
(mImageWidth * (mImageBitCount / 8) + 3) /4 *4
解释:
其中mImageWidth * (mImageBitCount / 8)为存储像素值所需的每行字节数。我们不妨将其设为b。
现在公式就变成了(b+3)/4*4。此处的除法为整除运算,因为每一行必须是4的倍数。所以必须要填充一定数目的无意义的字节。如b=1022,则每行字节数必须为(1022+3)/4*4=1024。
-----------------------------------------
& ~3和 /4 *4的效果是一样的。
应为为4的倍数所以对于一个二进制表示来说最后两位为0.所以可以用3的取反来做位与
-----------------------------------------
(nImageWidth*nBitCount+31)/32*4;
nImageWidth为图像宽度;nBitCount为每个像素所占的位数,如:二值为1,灰度为8,真彩24
-----------------------------------------
(((bits) + 31) / 32 * 4) 这个公式未必正确
(mImageWidth * (mImageBitCount / 8) + 3) & ~3 绝对正确
-----------------------------------------
(mImageWidth * (mImageBitCount / 8) 计算每行像素需要的字节数,此时可能会存在不足,比如 31*1/8 = 3.875 实际字节数应该是 4
计算出来的字节数应该是4的倍数,如果不足,最多相差 3 个字节,所以+3 就是
(mImageWidth * (mImageBitCount / 8) + 3) 此时计算出来的字节数绝对足够了,但可能还有多余,也不是4的倍数,比如 31*1/8+3 = 6 实际上只要 4 字节就可以了,于是要倒扣
4的倍数在二进制上就是最后两位为0,所以用 &~3 让最后两位为0
~3 就是让最后两位为0 &~3 就是让计算出来的数的二进制最后两位置为0,就可以被4整除了
希望我这个理解是正确的吧
最后
以上就是动人发卡为你收集整理的图像像素字节数的全部内容,希望文章能够帮你解决图像像素字节数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复