作业要求:将24位或32位真彩色 .bmp 图像文件,顺时针旋转90度。
可执行程序名:rotatebmp
用法:rotatebmp (文件名可变)
生成的是从 顺时针旋转90度得到的。
注意事项:c++编译有“结构边界对齐”的概念:
struct a {
int a;
char c;
那么sizeof(a)未必是5,很有可能是8,因为c++编译器为了提高**执行效率,往往在生成结构变量的时候,自动将其大小调整为4的整数倍,或8的整数倍。程序员可以在编译选项中指定对齐的方式是1字节,2字节,4字节或8字节(即每个结构变量的大小一定是1的倍数,2的倍数,4的倍数,8的倍数),也可以在程序开头直接用:
#pragma pack(2)
指定对齐边界是2字节,或1字节,4字节….
参考阅读:bmp图像文件格式1
bmp是bitmap的缩写形式,bitmap顾名思义,就是位图也即windows位图。它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。
在系统中以bmp为扩展名保存。
打开windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的bmp位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。
现在讲解bmp的4个组成部分:
1.文件头信息块。
0000-0001:文件标识,为字母ascii码“bm”。
0002-0005:文件大小。
0006-0009:保留,每字节以“00”填写。
000a-000d:记录图像数据区的起始位置。各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
2.图像描述信息块。
000e-0011:图像描述信息块的大小,常为28h。
0012-0015:图像宽度。
0016-0019:图像高度。
001a-001b:图像的plane总数(恒为1)。
001c-001d:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001e-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(.dib)中,每字节以00h填写。
002a-002d:垂直每米有多少像素,在设备无关位图(.dib)中,每字节以00h填写。
002e-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。
3.颜色表。
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为节。其中,每4字节表示一种颜色,并以b(蓝色)、g(绿色)、r(红色)、alpha(像素的透明度值,一般不需要)。
即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。
4.图像数据区。
颜色表接下来位为位**件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:
图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。
然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:
文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。
接下来的一个字节将开始记录下一行的信息。
2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。
如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节。
还有一点我要申明,当屏幕初始化为16或256色模式时,一定要设置调色板或修正颜色值,否则无法得到正确的图像颜色。
bmp图像文件格式 2
对于现存的所有的图像文件格式,我们在这里主要介绍bmp图像文件格式,并且文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的bmp图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适我们对之进行数字化处理。请读者记住,压缩过的图像是无法直接进行数字化处理的,如jpeg、gif等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。后续章节中我们将针对特殊的文件格式如何转换为bmp格式的文件问题作专门的论述,经过转换,我们就可以利用得到的未压缩的bmp文件格式进行后续处理。
对于jpeg、gif等格式,由于涉及到压缩算法,这要求读者掌握一定的信息论方面的知识,如果展开的话,可以写一本书,限于篇幅原因,我们只作一般性的讲解,有兴趣的朋友可以参考相关书籍资料。
一、bmp文件结构
1. bmp文件组成
bmp文件由文件头、位图信息头、颜色信息和图形数据四部分组成。文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在bmp文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要读者朋友关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。
2. bmp文件头
bmp文件头数据结构含有bmp文件的类型、文件大小和位图起始位置等信息。其结构定义如下: typedef struct tagbitmapfileheader
word bftype; /位**件的类型,必须为“bm”
dword bfsize; /位**件的大小,以字节为单位。
word bfreserved1; /位**件保留字,必须为0
word bfreserved2; /位**件保留字,必须为0
dword bfoffbits; /位图数据的起始位置,以相对于位**件头的偏移量表示,以字节为单位。
bitmapfileheader;该结构占据14个字节。
3. 位图信息头
bmp位图信息头数据用于说明位图的尺寸等信息。其结构如下:
typedef struct tagbitmapinfoheader{
dword bisize; /本结构所占用字节数。
long biwidth; /位图的宽度,以像素为单位。
long biheight; /位图的高度,以像素为单位。
word biplanes; /目标设备的平面数不清,必须为1
word bibitcount// 每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一。
dword bicompression; /位图压缩类型,必须是 0(不压缩),1(bi_rle8压缩类型)或2(bi_rle4压缩类型)之一。
dword bisizeimage; /位图的大小,以字节为单位。
long bixpelspermeter; /位图水平分辨率,每米像素数。
long biypelspermeter; /位图垂直分辨率,每米像素数。
dword biclrused;//位图实际使用的颜色表中的颜色数。
dword biclrimportant;//位图显示过程中重要的颜色数。
bitmapinfoheader;该结构占据40个字节。
注意:对于bmp文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16色图像采用rle4压缩算法,256色图像采用rle8压缩算法。
4. 颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个rgbquad类型的结构,定义一种颜色。rgbquad结构的定义如下:
typedef struct tagrgbquad {
bytergbblue;//蓝色的亮度(值范围为0-255)
bytergbgreen; /绿色的亮度(值范围为0-255)
bytergbred; /红色的亮度(值范围为0-255)
bytergbreserved;//保留,必须为0
rgbquad;
颜色表中rgbquad结构数据的个数由bitmapinfoheader 中的bibitcount项来确定,当bibitcount=1,4,8时,分别有2,16,256个颜色表项,当bibitcount=24时,图像为真彩色,图像中每个像素的颜色用三个字节表示,分别对应r、g、b值,图像文件没有颜色表项。位图信息头和颜色表组成位图信息,bitmapinfo结构定义如下:
typedef struct tagbitmapinfo {
bitmapinfoheader bmiheader; /位图信息头。
rgbquad bmicolors[1]; 颜色表。
bitmapinfo;
注意:rgbquad数据结构中,增加了一个保留字段rgbreserved,它不代表任何颜色,必须取固定的值为“0”,同时,rgbquad结构中定义的颜色值中,红色、绿色和蓝色的排列顺序与一般真彩色图像文件的颜色数据排列顺序恰好相反,既:若某个位图中的一个像素点的颜色的描述为“00,00,ff,00”,则表示该点为红色,而不是蓝色。
函数图像,导数图像
一 填空题。1 某医药研究所开发一种新药,如果成年人按规定的剂量服用,据检测,服药后每毫升血液中的含药量y 毫克 与时间t 小时 之间的关系用如图所示曲线表示 据进一步测定,每毫升血液中含药量不少于0.25毫克时,疾病有效。则服药一次 该疾病有效的时间为小时 2 若函数的图象如图,则a的取值范围是 ...
导函数图像与原函数图像关系 我
导函数图像类型题 类型一 已知原函数图像,判断导函数图像。1.福建卷11 如果函数的图象如右图,那么导函数的图象可能是。2.设函数f x 在定义域内可导,y f x 的图象如下左图所示,则导函数y f x 的图象可能为 3.函数的图像如下右图所示,则的图像可能是。4.若函数的图象的顶点在第四象限,则...
导函数图像与原函数图像关系 我
导函数图像类型题 类型一 已知原函数图像,判断导函数图像。1.福建卷11 如果函数的图象如右图,那么导函数的图象可能是。2.设函数f x 在定义域内可导,y f x 的图象如下左图所示,则导函数y f x 的图象可能为 3.函数的图像如下右图所示,则的图像可能是。4.若函数的图象的顶点在第四象限,则...