BMP头文件格式以及C语言读取头文件(二)

具体数据举例:
如某BMP文件开头:
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000 0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
BMP文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中已用*分隔。
一、图像文件头
1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’,表示是Windows支持的BMP格式。
2)2-3:整个文件大小。4690 0000,为00009046h=36934。//注意:这里默认计算机最小单位字节
3)4-5:保留,必须设置为0。
4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。8000 0000,为00000080h=128。
7)12-13:位图高度,以像素为单位。9000 0000,为00000090h=144。
8)14:位图的位面数,该值总是1。0100,为0001h=1。
二、位图信息头
9)15:每个像素的位数。有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。1000为0010h=16。
10)16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放)。RLE简单地说是采用像素数+像素值的方式进行压缩。T408采用的是位域存放方式,用两个字节表示一个像素,位域分配为r5b6g5。图中0300 0000为00000003h=3。
11)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。0090 0000为00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000为0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000为0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。如果是0,表示都重要。

具体代码C语言执行:(D  盘中有文件名为1的bmp图像)

#include <stdio.h>
#include <stdlib.h>
typedef  struct  tagBITMAPFILEHEADER
{
unsigned short int  bfType;       //位图文件的类型,必须为BM
unsigned long       bfSize;       //文件大小,以字节为单位
unsigned short int  bfReserverd1; //位图文件保留字,必须为0
unsigned short int  bfReserverd2; //位图文件保留字,必须为0
unsigned long       bfbfOffBits;  //位图文件头到数据的偏移量,以字节为单位
}BITMAPFILEHEADER;
typedef  struct  tagBITMAPINFOHEADER
{
long biSize;                        //该结构大小,字节为单位
long  biWidth;                     //图形宽度以象素为单位
long  biHeight;                     //图形高度以象素为单位
short int  biPlanes;               //目标设备的级别,必须为1
short int  biBitcount;             //颜色深度,每个象素所需要的位数
short int  biCompression;        //位图的压缩类型
long  biSizeImage;              //位图的大小,以字节为单位
long  biXPelsPermeter;       //位图水平分辨率,每米像素数
long  biYPelsPermeter;       //位图垂直分辨率,每米像素数
long  biClrUsed;            //位图实际使用的颜色表中的颜色数
long  biClrImportant;       //位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
typedef  struct
{
BITMAPFILEHEADER  file; //文件信息区
BITMAPINFOHEADER  info; //图象信息区
}bmp;

bmp  readbmpfile(void); //函数声明
int main(void)

{
  bmp m;          //定义一个结构变量
  m=readbmpfile(); //读取一个位图
  getchar();
  return 0;

}

  bmp  readbmpfile(void)
{ bmp  m;        //定义一个位图结构
  FILE *fp;
if((fp=fopen( "d:\\1.bmp", "r"))==NULL)
{ printf( "can't open the bmp imgae.\n ");
   exit(0);
}

else
{
fread(&m.file.bfType,sizeof(char),1,fp);
printf("类型为%c",m.file.bfType);
fread(&m.file.bfType,sizeof(char),1,fp);
printf("%c\n",m.file.bfType);       
fread(&m.file.bfSize,sizeof(long),1,fp);
printf("文件长度为%d\n",m.file.bfSize); 
fread(&m.file.bfReserverd1,sizeof(short int),1,fp);
printf("保留字1为%d\n",m.file.bfReserverd1);
fread(&m.file.bfReserverd2,sizeof(short int),1,fp);
printf("保留字2为%d\n",m.file.bfReserverd2);
fread(&m.file.bfbfOffBits,sizeof(long),1,fp);
printf("偏移量为%d\n",m.file.bfbfOffBits);
fread(&m.info.biSize,sizeof(long),1,fp);
printf("此结构大小为%d\n",m.info.biSize);
fread(&m.info.biWidth,sizeof(long),1,fp);
printf("位图的宽度为%d\n",m.info.biWidth);
fread(&m.info.biHeight,sizeof(long),1,fp);
printf("位图的高度为%d\n",m.info.biHeight);
fread(&m.info.biPlanes,sizeof(short),1,fp);
printf("目标设备位图数%d\n",m.info.biPlanes);
fread(&m.info.biBitcount,sizeof(short),1,fp);
printf("颜色深度为%d\n",m.info.biBitcount);
fread(&m.info.biCompression,sizeof(long),1,fp);
printf("位图压缩类型%d\n",m.info.biCompression);
fread(&m.info.biSizeImage,sizeof(long),1,fp);
printf("位图大小%d\n",m.info.biSizeImage);
fread(&m.info.biXPelsPermeter,sizeof(long),1,fp);
printf("位图水平分辨率为%d\n",m.info.biXPelsPermeter);
fread(&m.info.biYPelsPermeter,sizeof(long),1,fp);
printf("位图垂直分辨率为%d\n",m.info.biYPelsPermeter);
fread(&m.info.biClrUsed,sizeof(long),1,fp);
printf("位图实际使用颜色数%d\n",m.info.biClrUsed);
fread(&m.info.biClrImportant,sizeof(long),1,fp);
printf("位图显示中比较重要颜色数%d\n",m.info.biClrImportant);
}
return m;
}
结果执行如下:‍‍

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我来给您解释一下如何使用 C 语言完成 BMP 格式的两幅图像拼接。 首先,需要了解 BMP 格式的基本结构。BMP 文件由文件头和图像数据组成。文件头包含了图像的基本信息,如图像的宽度、高度、颜色深度等。图像数据则包含了每个像素的颜色信息。 下面是一个基本的步骤,帮助您完成 BMP 格式的两幅图像拼接: 1. 读取两幅图像的文件头和图像数据。 2. 创建一个新的 BMP 文件,并写入新的文件头。新文件的宽度应该是两幅图像的宽度之和,高度应该是两幅图像中较高的一幅。 3. 将第一幅图像的图像数据写入新文件中。 4. 将第幅图像的图像数据写入新文件中,注意在写入时需要指定偏移量,使得图像数据写入到正确的位置。 5. 关闭文件并保存。 请注意,这只是一个基本的步骤,您可能还需要考虑一些细节,如文件读写错误处理、图像数据压缩等。 希望这些信息能帮助您。 ### 回答2: 要用C语言完成BMP格式两幅图像的拼接,需要以下步骤: 1. 首先,我们需要了解BMP文件的结构。BMP文件由文件头、信息头和像素数据组成。文件头包含文件类型、文件大小等信息,信息头包含图像宽度、高度等信息,而像素数据则包含图像的实际像素信息。 2. 首先,我们需要使用C语言的文件操作函数来读取两幅BMP图像的文件头和信息头,并验证它们的格式是否符合BMP标准。 3. 接下来,我们需要根据图像的宽度和高度来计算每幅图像的像素数据大小,并通过动态内存分配函数来分配足够的内存空间。 4. 然后,我们需要使用文件操作函数将两幅图像的像素数据读取到内存中的相应位置。 5. 接着,我们需要将两幅图像的像素数据拼接到一起。这可以通过使用循环语句来遍历每个像素点,并将其复制到拼接后的像素数据中。 6. 最后,我们需要使用文件操作函数来创建一个新的BMP文件,并将拼接后的图像的文件头、信息头以及像素数据写入到该文件中。 需要注意的是,在拼接像素数据时,可能会遇到图像宽度对齐的问题。BMP图像的每行像素数据长度必须是4的倍数,因此在拼接时,需要根据宽度进行调整。 综上所述,使用C语言完成BMP格式两幅图像的拼接需要理解BMP文件的结构,利用文件操作函数读取和写入图像数据,使用动态内存分配函数分配内存空间,并通过循环遍历进行像素数据的拼接。 ### 回答3: 在C语言中完成BMP格式两幅图像的拼接可以通过以下步骤实现: 1. 导入相关的头文件和库文件,如stdio.h、stdlib.h、string.h等,以及用于操作BMP文件的自定义函数所在的头文件。 2. 读取两幅BMP图像文件的数据。使用自定义的函数读取BMP文件头信息,获取图像的宽度、高度等参数,并分配内存空间用于存储图像的像素数据。 3. 读取每个图像的像素数据。使用自定义的函数读取BMP文件的像素数据,并将其存储到相应的内存空间中。 4. 创建一个新的BMP图像文件的数据结构。生成一个新的BMP文件的文件头,并设置相应的参数,如宽度、高度等。 5. 合并两幅图像的像素数据。可以使用循环结构将两幅图像的像素数据进行合并,根据需求可以选择横向或纵向拼接,将两幅图像的像素逐个复制到新的BMP图像中。 6. 将合并后的图像数据写入BMP文件。使用自定义的函数将新的BMP图像的文件头和像素数据写入到一个新的BMP文件中。 7. 释放之前分配的内存空间。使用自定义的函数释放之前分配的存储图像像素数据的内存空间。 8. 完成图像拼接。新的BMP图像已经生成,可以进行后续的操作,如保存、显示或进一步处理。 需要注意的是,在具体实现中,需要根据BMP文件的格式和特点进行相应的处理,如按行或按列读取像素数据、考虑对齐字节等。同时,要保证两幅图像的像素数据能够完全拼接,需要确保两幅图像的宽度或高度相等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值