为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?
2014-12-30 22:51
274 查看
规定的,规定BMP文件的像素数据是按行存储的,而且每行的字节数必须为4的倍数,如果实际的像素数据不是4的倍数咋办?这就需要字节对齐,对齐是在一行的末尾添0以补足一行的字节数为4的倍数, ( biWidth*biBitCount+31)/32*4*biHeight//其中 biWidth是图像的宽度以像素为单位,biBitCount是每个像素的位数,如黑白图像(不是灰阶的,要么黑色要么白色)为1个像素1位,16色是4位,真彩色是24位 ......biHeight是指图像的高度 ( biWidth*biBitCount+31)/32*4是得出一行的实际要多少字节.乘以biHeight就是总的大小了 下面就来举例讲解是怎样对齐的(到达4的倍数): biWidth=1 biBitCount=1 biWidth*biBitCount=1;还不足1字节,所以要补足4字节 1+31=32(位), (1*1+31)/32=1,注意这里为什么要除以32?是因为4字节=32位,换个角度则是总共要多少个4字节, 最终一行字节数为:1*4=4字节, biWidth=52 biBitCount=1 biWidth*biBitCount=52*1=52 (52*1+31)/32=2 每行要2个4个字节 最终要多少还要乘以4,即: 2*4=8,即当宽度为52像素,每像素要1位存储时,每行要8个字节 再来: biWidth=111 biBitCount=24//即真彩色 biWidth*biBitCount=111*24=2664(位) 2664/(4*8)=2664/32=83 余8位,肯定不能把这8位丢掉不存储吧,其实目的就是要把这8位的末尾添加24个0装满32位(即4字节),所以: (biWidth*biBitCount+31)/32=(2664+31)/32=2695/32=84(4字节),即要84个4字节存储,所以最终还要乘以4: (biWidth*biBitCount+31)/32*4=84*4=336(字节) ..................................... 注意这里不能把31写成32,如果写成32则会出错如: biWidth=32 biBitCount=1 (biWidth*biBitCount+32)/32*4=64/32*4=8本来只需要4个字节,结果为8了 肯定也不能小了比如30,那么当: biWidth=1 biBitCount=1 (biWidth*biBitCount+32)/32*4=0肯定不对了, 还要注意的就是, (biWidth*biBitCount+31)/32*4不能写成(biWidth*biBitCount+31)/8,原因就是因为'/'是取整的意思 所以:(biWidth*biBitCount+31)/32*4 不等于 (biWidth*biBitCount+31)/8,不信你举个例子试试. 记住:(biWidth*biBitCount+31)/32 是关键,表示需要多少个(4字节),把这个结果再乘以4结果肯定是4的倍数了.
相关文章推荐
- 在24位真彩色位图中插入文件并隐藏文件
- ImageMan.Net使用教程:如何判断位图图像为彩色,灰阶或黑白
- 24位位图转4位彩色图(BMP)
- 完整24位真彩色位图灰度化源代码
- C语言创建24位真彩色位图
- 将24位真彩色位图保存为256色(8位)位图
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位真彩色位图转换成8位灰度图片的代码实现
- 32BPP窗口模式下24位位图的像素操作(2)
- 32BPP窗口模式下24位位图的像素操作(1)
- 位图的宽度为什么要:#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
- 完整24位真彩色位图灰度化源代码
- 通过Quartz+Core Image读取JPEG图像的二进制位图以及将二进制位图做成图像
- $(window).height()取值等于$(document).height()的问题
- 矩阵中 为什么矩阵的迹就是特征值的和 为什么等于第二项系数?要具体证明
- 为什么要在html和body加上“height:100%;”
- ImageView 透明度改变 位图的获取
- 把24位和32位BMP位图转为灰色bmp位图
- Determine PixelWidth and PixelHeight for JPEG image in Silverlight 2B1