我是靠谱客的博主 动人发卡,最近开发中收集的这篇文章主要介绍图像像素字节数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


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

图像的像素占的字节数为4的整数倍。

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:     
      当biBitCount(每个像素所需的位数)=1时,8个像素占1个字节; 
      当biBitCount=4时,2个像素占1个字节; 
      当biBitCount=8时,1个像素占1个字节; 
      当biBitCount=24时,1个像素占3个字节; 
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。 
一个扫描行所占的字节数计算方法:   DataSizePerLine=   (biWidth*   biBitCount+31)/8;   
我们后面定义了一个宏   #define   WIDTHBYTES(i)      ((i+31)/32*4)   
每一行的字节数必须是4的整倍数,只要调用   
                  WIDTHBYTES(bi.biWidth*bi.biBitCount) 
就能完成这一换算。 
        举一个例子,对于2色图,如果图象宽是31,则每一行需要31位存储,合3个字节加7位,因为字节数必须是4的整倍数,所以应该是4,而此时的               biWidth=31,biBitCount=1,WIDTHBYTES(31*1)=4,和我们设想的一样。再举一个256色的例子,如果图象宽是31,则每一行需要31个字节存储,因为字节数必须是4的整倍数,所以应该是32,而此时的       biWidth=31,biBitCount=8,WIDTHBYTES(31*8)=32, 
和我们设想的一样。

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

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

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

最后

以上就是动人发卡为你收集整理的图像像素字节数的全部内容,希望文章能够帮你解决图像像素字节数所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部