为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?
规定的,规定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位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?的更多相关文章
- C#保存图片到文件夹区分8位和24位
1.保存图像--24位位图(显示的图像,包括增加结果到界面上的数据) Image image2 = default(Image); image2 = cogRecordDisplay1.CreateC ...
- 将真彩色转换成增强色的方法(即RGB32位或RGB24位颜色转换成RGB16位颜色的函数)
今天由于程序需要,需要将真彩色转换成增强色进行颜色匹配,上网搜了一下没搜到相应函数,于是研究了一下RGB16位的增强色,写了这个函数: public static int RGB16(int argb ...
- bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换
今日,有同事问我.rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过推測与測试,分析出了例如以下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitC ...
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>
颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...
- C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)
C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...
- BMP位图之8位位图(三)
起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...
- BMP位图之4位位图(二)
起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...
- BMP位图之1位位图(一)
起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...
- geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)
目录 前言 实现过程 总结 一.前言 上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...
随机推荐
- jstree 插件的使用笔记(一)
官方:http://www.jstree.com/ 一.节点的描述 官方资料:http://www.jstree.com/docs/json/ 格式一 { id : "string&quo ...
- (转)MySql开启远程连接权限
命令行登陆: mysql -u root -p 不行的话可以从MySql.exe进入,找到Mysql根目录中路径类似:"MySQL\bin\mysql.exe",这样: D:\We ...
- 通过maven添加quartz
pom.xml中相关dependency信息 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <depen ...
- java开发常用命令
cd /d e:work2,更改至当前工作目录svnup.bat,批量更新所有项目 @echo off for /D %%i in (.\*) do ( echo %%i svn up %%i )ho ...
- HTML <input> 标签的 maxlength 属性
前端的表单,需要进行验证. 结合JS表单验证框架,写了很多前端验证的代码. 其中,有这么一个需求:用户最多只能输入10个字符. 按照惯性,肯定是会去写JS表单验证了. 实际上,根本没有必要. HTML ...
- 【转】PS学堂之一:展示一下自己做的圆形印章
共分七个步骤: 1.点击文件--新建,新建一个500×500像素,背景为透明的文件,选择RGB颜色. 2.把前景色和文字颜色设置为正红(R为255,G和B为0). 3.在视图下拉菜单中选择标尺,将横. ...
- shell--学习 sed
sed:数据流编辑器 读一行到内存处理一行然后输出一行. 模式空间: sed:默认不编辑源文件 sed [option] ADDRESSCOMMAND file 1.起始行. 结束行 sed ...
- LinearLayout和RelativeLayout
LinearLayout和RelativeLayout 共有属性:java代码中通过btn1关联次控件android:id="@+id/btn1" 控件宽度android:layo ...
- iOS UIView常用方法和属性
UIView常用方法 addSubView: // 添加子视图 insertSubview: atIndex // 视图插入到指定索引位置 insertSubview:aboveSubview: // ...
- view, surfaceView, invalidate, postInvalidate, 刷新屏幕
http://blog.csdn.net/linghu_java/article/details/9985489 1.view view在api中的结构 Java.lang.Object Androi ...