规定的,规定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?的更多相关文章

  1. C#保存图片到文件夹区分8位和24位

    1.保存图像--24位位图(显示的图像,包括增加结果到界面上的数据) Image image2 = default(Image); image2 = cogRecordDisplay1.CreateC ...

  2. 将真彩色转换成增强色的方法(即RGB32位或RGB24位颜色转换成RGB16位颜色的函数)

    今天由于程序需要,需要将真彩色转换成增强色进行颜色匹配,上网搜了一下没搜到相应函数,于是研究了一下RGB16位的增强色,写了这个函数: public static int RGB16(int argb ...

  3. bmp文件格式中rgb555与rgb888之间的转换,24位与16位位图的转换

    今日,有同事问我.rgb555模式下的位图文件的格式问题,于是花了一下午的时间通过推測与測试,分析出了例如以下bmp文件在rgb555模式下的文件存储规律: 1:bmp文件的文件信息头中的biBitC ...

  4. 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>

    颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...

  5. C#图片灰度处理(位深度24→位深度8)、C#图片二值化处理(位深度8→位深度1)

    C#图片灰度处理(位深度24→位深度8) #region 灰度处理 /// <summary> /// 将源图像灰度化,并转化为8位灰度图像. /// </summary> / ...

  6. BMP位图之8位位图(三)

    起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...

  7. BMP位图之4位位图(二)

    起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...

  8. BMP位图之1位位图(一)

    起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...

  9. geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

    目录 前言 实现过程 总结 一.前言        上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...

随机推荐

  1. ios-uitableviewcell展开

    #import <UIKit/UIKit.h> @interface ZSDHelpCell : UITableViewCell @property (weak, nonatomic) I ...

  2. 干货:VLDB论文摘要-阿里技术突破性创新

    阿里技术突破性创新 世界顶级大规模数据处理分析管理会议VLDB(VERY LARGE DATA BASE)于9月1日至5日在杭州举办,该会议也是也是大数据云计算领域的盛会,阿里巴巴两个团队在这个会议上 ...

  3. centos 下 yum安装和卸载软件

    安装的命令是,yum install xxx,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突,那么最好,下载安装;如果有,则会给出提示,询问是否要同时安装依赖,或删 ...

  4. System.Data.OracleClient requires Oracle client software version 8.1.7 or greater

    It is a security issue, so to fix it simply do the following: Go to the Oracle folder. 1- Right Clic ...

  5. hihocoder 1082 然而沼跃鱼早就看穿了一切(字符串替换)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区 ...

  6. 使 div 元素看上去像一个按钮

    使 div 元素看上去像一个按钮 div { appearance:button; -moz-appearance:button; /* Firefox */ -webkit-appearance:b ...

  7. Part 89 to 91 Talking about pass the parameters in thread

    Part 89   ParameterizedThreadStart delegate Use ParameterizedThreadStart delegate to pass data to th ...

  8. 经典算法系列--kmp

    前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导 ...

  9. Zend studio 12.5.1安装aptana

    aptana是zend studio的一个插件.解决zend对于前台html支持,加亮的问题. 安装方法其实很简单 ,直接给出aptana的地址了. http://download.aptana.co ...

  10. PHP实现前台同步显示后台任务进度

    一次批量发送几千条短信. 如果直接在后台循环执行虽然可行,但是前台操作用户就只能坐着空等,完全看不到后台执行结果,所以考虑能不能有一种办法可以在php后台执行过程中同时在前台显示后台执行任务进度呢. ...