计算图像像素占字节数的纠结

Code:
  1. int imgBuffSize = (m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight;  

 

 

就是后面的+3让我纠结了一阵子。原来是图像的像素占的字节数为4的整数倍。

从网上找了一下得到结果:

我看到一个根据位图的每行像素点数和位数计算每行字节数的公式,请问为什么这样计算?

(mImageWidth * (mImageBitCount / 8) + 3) & ~3;

mImageWidth 位图宽度

mImageBitCount 位图的点位数

-----------------------------------------

------------------------------------------

#1楼 得分:10回复于:2010-08-26 20:36:34

8bit占一个字节,图像每行的字节数必须是4的倍数,我没见过这个公式,但是

#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)这个公式是经常用的

-----------------------------------------

------------------------------------------

#2楼 得分:10回复于:2010-08-26 21:08:32

(mImageWidth * (mImageBitCount / 8) + 3) /4 *4

解释:

其中mImageWidth * (mImageBitCount / 8)为存储像素值所需的每行字节数。我们不妨将其设为b。

现在公式就变成了(b+3)/4*4。此处的除法为整除运算,因为每一行必须是4的倍数。所以必须要填充一定数目的无意义的字节。如b=1022,则每行字节数必须为(1022+3)/4*4=1024。

-----------------------------------------

------------------------------------------

#3楼 得分:10回复于:2010-08-26 21:11:05

& ~3

和 /4 *4的效果是一样的。

应为为4的倍数所以对于一个二进制表示来说最后两位为0.所以可以用3的取反来做位与

-----------------------------------------

------------------------------------------

#4楼 得分:10回复于:2010-08-26 22:30:28

(nImageWidth*nBitCount+31)/32*4;

nImageWidth为图像宽度;nBitCount为每个像素所占的位数,如:二值为1,灰度为8,真彩24

-----------------------------------------

------------------------------------------

#5楼 得分:0回复于:2010-08-27 10:37:18

(((bits) + 31) / 32 * 4) 这个公式未必正确

(mImageWidth * (mImageBitCount / 8) + 3) & ~3 绝对正确

-----------------------------------------

------------------------------------------

#6楼 得分:0回复于:2010-08-27 10:51:19

我的理解是:

(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整除了

希望我这个理解是正确的吧

---------------------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值