BMP文件结构读写操作(图文)_c实现
位图文件(BMP)
位图⽂件(BMP)位图⽂件简介BMP(Bitmap-File)格式是最常⽤的图像⽂件存取格式之⼀,是微软为其Windows环境设置的标准图像格式,BMP位图⽂件默认的⽂件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。
⽤BMP格式存放的图像⼏乎可以被所有的图像显⽰软件读取。
BMP图形⽂件是Windows采⽤的图像⽂件格式,在Windows环境下运⾏的所有图像软件都⽀持BMP图像⽂件格式。
Windows系统内部个图像绘制操作都是以BMP为基础的。
Windows3.0以前的BMP⽂件格式与显⽰设备有关,因此把这种BMP图像⽂件格式称为设备相关位图(Device Dependent Bitmap,DDB)⽂件格式。
Windows3.0以后的BMP⽂件都与显⽰设备⽆关,因此把这种BMP⽂件格式称为设备⽆关位图(Device Independent Bitmap,DIB)格式。
BMP⽂件格式摘要每个BMP⽂件只能存放⼀张图像。
图像数据是否采⽤压缩⽅式存放,取决于⽂件的⼤⼩与格式,即压缩处理是BMP图像⽂件的⼀个选项,⽤户可以根据需要进⾏选择。
其中,⾮压缩格式是BMP图像⽂件所采⽤的⼀种通⽤格式,它按照⼀定的顺序忠实的记录图像中每⼀个像素的颜⾊值。
如果⽤户确定将BMP⽂件格式压缩处理,则Windows设计了⼀种压缩⽅式:如果位图为16⾊模式,则采⽤RLE4压缩⽅式,如果图像为256⾊模式,则采⽤RLE8压缩⽅式。
BMP图像数据⽂件格式可以存储为单⾊,16⾊,256⾊和真彩⾊四种图像数据,其数据的排列顺序与⼀般⽂件不同,它以图像的左下⾓作为起点存储图像,⽽不是以图像的坐上⾓为起点。
⽽且BMP图像⽂件格式中还存在另外⼀个与众不同的特点,即其调⾊板数据所采⽤的数据结构中,红,绿,蓝三种基⾊数据的排列顺序也恰好与其他图像⽂件格式相反。
总之,BMP图像⽂件格式拥有许多适合于Windows环境的新特⾊,⽽且随着Windows版本的不断更新,微软也在不断的改进BMP图像⽂件格式。
完整程序_C语言对BMP图像的读和写和对像素的操作
#include <stdio.h>#include "Windows.h"BOOL readBmp(char *bmpName);BOOL saveBmp(char *bmpName, char *imgBuf, int width, int heigh, int biBitCount, RGBQUAD *pColorTable);char *pBmpBuf; //位图数据int bmpWidth; // 图像宽度int bmpHeight; //图像高度int biBiCount; //图像类型,每像素位数RGBQUAD *pColorTable; //位图颜色表指针int main(){char readName[] = "read.BMP";readBmp(readName);char writeName[] = "write.BMP";saveBmp(writeName, pBmpBuf, bmpWidth, bmpHeight, biBiCount, pColorTable);int lineByte = (bmpWidth*bmpHeight/8+3)/4*4;if (biBiCount == 8){for (int i = 0; i < bmpWidth/2; i++){for (int j = 0; j < bmpHeight/2; j++){*(pBmpBuf+i*lineByte+j) = 0;}}}else if (biBiCount == 24){/////对于24位真彩图,每个像素占三个字节分别存储R、G、B三个颜色分量的颜色值for (int i = 0; i < bmpWidth/2; i++){for (int j = 0; j < bmpHeight/2; j++){for (int k = 0; k < 3; k++)*(pBmpBuf+i*lineByte+j*3+k) = 0; //将rgb三个颜色分量设置成黑色}}}char Name[] = "copy.BMP";saveBmp(Name, pBmpBuf, bmpWidth, bmpHeight, biBiCount, pColorTable);delete []pBmpBuf;if (biBiCount == 8){delete []pColorTable;}return 0;}BOOL readBmp(char *bmpName ){FILE *pf = fopen(bmpName, "rb");if (pf == NULL) return FALSE;printf("read %s succeeded!\n", bmpName);fseek(pf, sizeof(BITMAPFILEHEADER), SEEK_SET);BITMAPINFOHEADER infoHeader;fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pf);bmpWidth = infoHeader.biWidth;bmpHeight = infoHeader.biHeight;biBiCount = infoHeader.biBitCount;//图像每行的字节数,一定要是4的倍数int lineByte = (bmpWidth*bmpHeight/8+3)/4*4;pBmpBuf = new char[lineByte*bmpHeight];//灰度图像有颜色表if (biBiCount == 8){pColorTable = new RGBQUAD[256];fread(pColorTable, sizeof(RGBQUAD), 1, pf);}fread(pBmpBuf, lineByte*bmpHeight, 1, pf);fclose(pf); //关闭文件return TRUE;}BOOL saveBmp(char *bmpName, char *imgBuf, int width, int heigh, int biBitCount, RGBQUAD *pColorTable ){FILE *pf = fopen(bmpName, "wb");if (pf == NULL) return FALSE;printf("write %s succeeded!\n", bmpName);//写头文件int colorTableSize = 0;if (biBitCount == 8){colorTableSize = 1024;}int lineByte = (width*heigh/8+3)/4*4;BITMAPFILEHEADER filehead;filehead.bfOffBits = 54+colorTableSize;filehead.bfType = 0x4D42;filehead.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTableSize+lineByte*heig h;filehead.bfReserved1 = 0;filehead.bfReserved2 = 0;fwrite(&filehead, sizeof(BITMAPFILEHEADER), 1, pf);BITMAPINFOHEADER infoHead;infoHead.biBitCount = biBitCount;infoHead.biWidth = width;infoHead.biHeight = heigh;infoHead.biSize = 40;infoHead.biClrImportant = 0;infoHead.biSizeImage = lineByte*heigh;infoHead.biClrUsed = 0;infoHead.biPlanes = 1;infoHead.biXPelsPerMeter = 0;infoHead.biYPelsPerMeter = 0;fwrite(&infoHead,sizeof(BITMAPINFOHEADER), 1, pf);if (biBitCount == 8){fwrite(pColorTable, sizeof(RGBQUAD), 256, pf);}fwrite(pBmpBuf, lineByte*heigh, 1, pf);fclose(pf);return TRUE;}。
BMP图像格式详解
BMP格式图像文件详析首先请注意所有的数值在存储上都是按“高位放高位、低位放低位的原则”,如12345678h放在存储器中就是7856 3412)。
下图是导出来的开机动画的第一张图加上文件头后的16进制数据,以此为例进行分析。
T408中的图像有点怪,图像是在电脑上看是垂直翻转的。
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,“h”表示是16进制数。
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:每个像素的位数。
bmp文件格式详解
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。
由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。
Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。
下面以Notepad++为分析工具,结合Windows的位图数据结构对BMP文件格式进行一个深度的剖析。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:bmp文件头(bmp file header):提供文件的格式、大小等信息位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表位图数据(bitmap data):就是图像数据啦^_^下面结合Windows结构体的定义,通过一个表来分析这四个部分。
我们一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况下是不需要调色板的,也就是所位图信息头后面紧跟的就是位图数据了。
因此,我们常常见到有这样一种说法:位图文件从文件头开始偏移54个字节就是位图数据了,这其实说的是24或32位图的情况。
这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。
下面针对一幅特定的图像进行分析,来看看在位图文件中这四个数据段的排布以及组成。
我们使用的图像显示如下:这是一幅16位的位图文件,因此它是含有调色板的。
在拉出图像数据进行分析之前,我们首先进行几个约定:1. 在BMP文件中,如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”。
bmp的知识点
bmp的知识点BMP的知识点BMP(Bitmap)是一种图像文件格式,它以像素为基本单位来描述图像。
下面将介绍BMP文件的结构、特点以及常见的应用。
一、BMP文件结构BMP文件由文件头、位图信息头、调色板和图像数据组成。
1. 文件头(14字节):包含文件类型(2字节)、文件大小(4字节)、保留字段(4字节)和图像数据偏移量(4字节)等信息。
2. 位图信息头:包含位图信息头大小(4字节)、图像宽度(4字节)、图像高度(4字节)、颜色平面数(2字节)、每个像素所占位数(2字节)等信息。
3. 调色板(可选):用于存储图像的颜色信息,包括调色板项数、颜色索引和颜色值等。
4. 图像数据:按行存储的像素数据,每个像素用指定的位数来表示。
二、BMP文件特点1. BMP文件格式简单,易于解析和处理,适用于各种平台和应用程序。
2. BMP文件支持多种色彩深度,如1位、4位、8位、16位、24位和32位等,可以满足不同图像质量和存储空间需求。
3. BMP文件保留了图像的原始数据,不进行压缩,因此不会损失图像的质量,但文件大小相对较大。
4. BMP文件支持灰度图像和彩色图像,灰度图像每个像素只有一个亮度值,彩色图像每个像素有红、绿、蓝三个分量的值。
三、BMP文件的应用1. 图像处理:BMP文件是常用的图像处理格式,可以通过读取、修改和保存BMP文件来实现各种图像处理操作,如图像旋转、缩放、灰度化、边缘检测等。
2. 图像显示:BMP文件可以被各种图像显示软件和设备所支持,如画图工具、图片浏览器、数码相框、打印机等。
3. 图像转换:BMP文件可以通过转换工具将其转换为其他图像格式,如JPEG、PNG、GIF等,以满足不同应用场景的需求。
4. 图像分析:BMP文件中的像素数据可以被提取和分析,用于图像处理算法的开发、图像识别和图像分析等领域。
5. 图像存储:BMP文件可以作为图像的原始存储格式,用于长期保存和备份,以保证图像质量和数据的完整性。
位图文件(BMP)格式分析以及程序实现
inf.read((char*)&header, sizeof(header));if(header.bfType != 0x4D42)return false;这个很简单,没有什么好说的。
2、加载位图信息头//Load the image information headerBITMAPINFOHEADER infoheader;memset(&infoheader, 0, sizeof(infoheader));inf.read((char*)&infoheader, sizeof(infoheader));m_iImageWidth = infoheader.biWidth;m_iImageHeight = infoheader.biHeight;m_iBitsPerPixel = infoheader.biBitCount;这里我们得到了3各重要的图形属性:宽,高,以及每个像素颜色所占用的位数。
3、行对齐由于Windows在进行行扫描的时候最小的单位为4个字节,所以当图片宽X 每个像素的字节数!= 4的整数倍时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。
位图文件里的数据在写入的时候已经进行了行对齐,也就是说加载的时候不需要再做行对齐。
但是这样一来图片数据的长度就不是:宽X 高X 每个像素的字节数了,我们需要通过下面的方法计算正确的数据长度://Calculate the image data sizeint iLineByteCnt = (((m_iImageWidth*m_iBitsPerPixel) + 31) >> 5) << 2;m_iImageDataSize = iLineByteCnt * m_iImageHeight;4、加载图片数据对于24位和32位的位图文件,位图数据的偏移量为sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER),也就是说现在我们可以直接读取图像数据了。
详解用VC实现bmp位图的打开-fengqing888的日志-网易博客
详解用VC实现bmp位图的打开-fengqing888的日志-网易博客详解用VC实现bmp位图的打开技术_图片编程 2009-12-18 13:59:17 阅读262 评论0 字号:大中小我最近在学VC++数字图像处理,作为一个初学者,万里长征的第一步当然是打开一幅图像,这几天一直在看怎么实现这一功能,虽说简单,但是如果这一步不能做到,那么下面也就无法进行了,所以我总结了一下这个过程,写出来供大家参考。
也希望大家多多批评啊。
这里我就不想介绍关于位图的理论内容了,只是写一下实现的部分。
0.准备工作创建一个SDI,工程名Test,“隐藏工具栏”和“打印和打印预览”取消了,不用那么复杂,简单点就行1.创建菜单创建两个菜单:Caption: 打开 ID: ID_FILE_OPENCaption: 显示原图 ID: IDM_YUANTU2.对打开菜单进行响应右键打开菜单,建立类向导,在CTestDoc类中,进行COMMAND响应,生成OnFileOpen函数,代码如下:void CTestDoc::OnFileOpen(){// TODO: Add your command handler code hereCFileDialog fileDlg(TRUE);//创建一个CfileDialog类对象fileDlg,第一个参数TRUE为打开对话框,若为FALSE,则为另存为fileDlg.m_ofn.lpstrTitle="图片打开对话框";//设置打开对话框的标题fileDlg.m_ofn.lpstrFilter="BMP Files(*.bmp)\0*.bmp\0\0";//设置打开的文件类型if(IDOK==fileDlg.DoModal ())//这个语句有两层意义,第一是dlg.DoModal()作用是弹出CPortDlg对话框,第二层是dlg.DoModal()==IDOK是你点击了对话框上的OK按钮就是说你同时做了上述两件事时就执行if语句后面的程序。
BMP格式解析
BMP格式解析⼀、介绍 BMP⽂件格式,⼜称为位图,是Windows系统中⼴泛使⽤的图像⽂件格式。
BMP⽂件的数据分为四个部分:bmp⽂件头(bmp file header):提供⽂件的格式、⼤⼩等信息位图信息头(bitmap information):提供图像数据的尺⼨、位平⾯数、压缩⽅式、颜⾊索引等信息调⾊板(color palette):可选,如使⽤索引来表⽰图像,调⾊板就是索引与其对应的颜⾊的映射表位图数据(bitmap data):图像数据⼆、代码⽰例#include <unistd.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>struct bmp_header{unsigned short type; //⽂件类型unsigned int total_size; //整个位图⼤⼩,头部 + 图像数据单位字节unsigned short reserved1;unsigned short reserved2;unsigned int valid_offset; //图像数据偏移量} __attribute__((packed));struct bmp_info{unsigned int info_size; //该结构体⼤⼩,固定40字节unsigned int bmp_width; //图⽚宽度unsigned int bmp_height; //图⽚⾼度unsigned short planes; //总是1unsigned short bitcount; //像素多少位表⽰unsigned int compression; // 0:BI_RGB 不压缩; ......unsigned int img_size; //图像有效数据⼤⼩,单位字节int x_pix_meter; //⽔平分辨率,像素/⽶表⽰int y_pix_meter; //垂直分辨率,像素/⽶表⽰unsigned int color_used; //位图实际使⽤彩⾊表中的颜⾊索引数,⼀般0unsigned int color_mportants; //color_used 上⾯使⽤的索引值重要数, 0表⽰都重要}__attribute__((packed));int bmp_analyze(unsigned char *path){int fd = -1, i;struct bmp_header f_header;struct bmp_info f_info;//打开bmp图⽚fd = open(path, O_RDONLY);if (fd < 0) {printf("open %s error.\n", path);return -1;}//读取⽂件头信息read(fd, &f_header, sizeof(struct bmp_header));printf("type:0x%x(%c%c)\n", f_header.type, f_header.type&0xff, (f_header.type>>8)&0xff);printf("total_size:%d\n", f_header.total_size);printf("reserved1:%d\n", f_header.reserved1);printf("reserved2:%d\n", f_header.reserved2);printf("valid_offset:%d\n", f_header.valid_offset);read(fd, &f_info, sizeof(struct bmp_info));printf("info_size:%d\n", f__size);printf("bmp_width:%d\n", abs(f_info.bmp_width));printf("bmp_height:%d\n", abs(f_info.bmp_height));printf("planes:%d\n", f_info.planes);printf("bitcount:%d\n", f_info.bitcount);printf("compression:%d\n", f_pression);printf("img_size:%d\n", f_info.img_size);printf("x_pix_meter:%d\n", f_info.x_pix_meter);printf("y_pix_meter:%d\n", f_info.y_pix_meter);printf("color_used:%d\n", f_info.color_used);printf("color_mportants:%d\n", f_info.color_mportants);//关闭打开的⽂件close(fd);return0;}int main(int argc, char **argv){unsigned char *path = argv[1];if(path == NULL) {printf("invalid file path \n");exit(-1);} else {printf("read bmp file: %s\n", path); }bmp_analyze(path);return0;}三、效果./a.out 24x32_3.bmpread bmp file: 24x32_3.bmptype:0x4d42(BM)total_size:3126reserved1:0reserved2:0valid_offset:54info_size:40bmp_width:24bmp_height:32planes:1bitcount:32compression:0img_size:3072x_pix_meter:2834y_pix_meter:2834color_used:0color_mportants:0四、附件解析 链接:注意格式是ARGB8888,只不过⼩端存储(低字节放在低地址),图⽚数据⼤⼩ 24*32*4字节 = 3072,加上头部 14 + 40 = 3126 字节后续会使⽤该BMP图⽚打⽔印在YUV上:。
C语言读取BMP格式图片
另外需要注意的是这是一个近似值,对于 n 位的位图图像来说,尽管可能有最多 种颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板 仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于 如果想知道这些值是如何得到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素, 根据几个图像参数的不同计算出的大小与实际的 文件大小将会有一些细小的差别。 典型的文件格式 。
存储算法
BMP 文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大 很多。例如,一个 800×600 的 24 位几乎占据 1.4MB 空间。因此它们通常不适合 在因特网或者其他低速或者有容量限制的媒介上进行传输。 根据颜色深度的不同,图像上的一个像素可以用一个或者多个字节表示,它由 n/8 所确定(n 是位深度,1 字节包含 8 个数据位)。图片浏览器等基于字节的 ASCII 值计算像素的颜色,然后从调色板中读出相应的值。更为详细的信息请参 阅下面关于位图文件的部分。 n 位 2n 种颜色的包含调色板的位图近似字节数可以用下面的公式计算:
unsigned char r[2000][2000],output_r[2000][2000]; unsigned char g[2000][2000],output_g[2000][2000]; unsigned char b[2000][2000],output_b[2000][2000];
int main(int argc, char* argv[]) { /* Open bmp file */ unsigned char *fp_temp;
bmpFileTest(fpbmp); bmp file or not bmpHeaderPartLength(fpbmp); Header Part BmpWidthHeight(fpbmp); width of the Data Part
24位BMP图像
#include<stdio.h>#include<malloc.h>void main(){FILE *fpIn,*fpOut;///////////////////////////struct RGBQUAD{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;} bicolor;char bfty[2];short bfreserved1,biplanes,bibitcount;long bfsize,bfoffbit,bisize,biwidth,biheight;long bicompression,bisizeimage,bix,biy,biclrused,biclrimportant;char *cR;int iCol,iRow;int i,j;int iWidth;char *lpsData;int iL;short sTemp;////////////////////////////////////fpIn=fopen("F:/课堂学习/遥感数字图像处理/data/AA","rb");fpOut=fopen("F:/课堂学习/遥感数字图像处理/data/Tm23.bmp","wb");//D:\??\??????????\Data\dataiCol=600;iRow=600;bfty[0]='B';bfty[1]='M';bfsize=54+iCol*iRow*3;bfreserved1=0;bfoffbit=54;/////////////////bisize=40;biwidth=iCol;biheight=iRow;biplanes=1;bibitcount=24;bicompression=0;bisizeimage=iRow*iCol*3;bix=0;biy=0;biclrused=0;biclrimportant=0;/////////////////////////fwrite(&bfty[0],1,1,fpOut);//fprintffwrite(&bfty[1],1,1,fpOut);fwrite(&bfsize,4,1,fpOut);fwrite(&bfreserved1,2,1,fpOut);fwrite(&bfreserved1,2,1,fpOut);fwrite(&bfoffbit,4,1,fpOut);///////////////////////////////////fwrite(&bisize,4,1,fpOut);fwrite(&biwidth,4,1,fpOut);fwrite(&biheight,4,1,fpOut);fwrite(&biplanes,2,1,fpOut);fwrite(&bibitcount,2,1,fpOut);fwrite(&bicompression,4,1,fpOut);fwrite(&bisizeimage,4,1,fpOut);fwrite(&bix,4,1,fpOut);fwrite(&biy,4,1,fpOut);fwrite(&biclrused,4,1,fpOut);fwrite(&biclrimportant,4,1,fpOut);////////////////////////////////////////////// ///////////////////////////////iWidth=(iCol*3+3)/4*4;//为什么?cR=(char *)malloc(iWidth*sizeof(char)*iRow); lpsData=(char *)malloc(600*sizeof(char));////////////////////////////fseek(fpIn,600*600*1,0);for(i=0;i<iRow;i++){fread(lpsData,1,600,fpIn);for(j=0;j<iCol;j++)//600{iL=(iRow-1-i)*iWidth+j*3;sTemp=lpsData[j];//[750+j*5+0];cR[iL]=sTemp*2;}}fseek(fpIn,600*600*2,0);for(i=0;i<iRow;i++){fread(lpsData,1,600,fpIn);for(j=0;j<iCol;j++)//600{iL=(iRow-1-i)*iWidth+j*3+1;sTemp=lpsData[j];//[750+j*5+0];cR[iL]=sTemp*2;}}fseek(fpIn,600*600*3,0);for(i=0;i<iRow;i++){fread(lpsData,1,600,fpIn);for(j=0;j<iCol;j++)//600{iL=(iRow-1-i)*iWidth+j*3+2;sTemp=lpsData[j];//[750+j*5+0];cR[iL]=sTemp*2;}}fwrite(cR,sizeof(char),iWidth*iRow,fpOut); free(cR);free(lpsData);fclose(fpOut);fclose(fpIn);}。
BMP图像格式解析及其空间域处理的实现
Wid w 采 用 的 图像 文 件存 储 格 式 .在 Wid w no s no s 环 境 下 运 行 的所 有 图像 处 理 软 件 都 支 持 这 种 格
式 。Wid w . n o s 0以前 的 B 3 MP位 图文件 格 式 与显
tp d f t c t BT P IE E E { y e e r t a I MA F L H AD R su g
理, 因此 需 要熟 悉 B MP图像 的 内部 结 构 , 文就 本
着重介 绍其结 构 ,并根 据 它 的结 构 进行 一些 简单
的图像 处理 。
本文 用 C语 言 中 的文件 操作 函数 ( p nf a ,  ̄ e ,ed fr e等) wi t 以字 节为 单位 读 取 位 图文件 头 ( 1 以 0进
示 , 字节 4个
U N f sre l / 留位 , 被使 用 , 置 I T b evd ;/ Re 保 不 设
为 0 2个 字节 ,
了让 Widw n o s能 够 在 任 何 类 型 的显 示 设 备 上 显 示B MP位 图文件 。B MP位 图文 件 默认 的文 件扩 展 名是 B MP或 者 b p m。 由于 进行 图像 处 理 时 多采 用 对 B MP进 行 处
B T P I E AD R 1 I MA F L HE E 4个 字节 B M I F HE D R 4 I AP N 0 A E 0个 字节 r
调 色板 信 息
位 图 数据
RBUD GQA
B YTE
不定( 根据 位 图像 素 位 数 不同而不同) 不 定
图数据 。为 了表 示这些 信 息 的方 便我 们把 这 几部 分分 别 采用结 构体 的形 式来 定义 。具 体信 息 如表
C语言读取BMP格式图片
典型的位图文件格式通常包含下面几个数据块:
位图头:保存位图文件的总体信息。 位图信息:保存位图图像的详细信息。 调色板:保存所用颜色的定义。 位图数据:保存一个又一个像素的实际图像。
下面的部分将会详细地描述位图文件中保存的数据。 需要注意的是这是标准位图 的文件格式, 其他一些位图图像可能根据生成文件的应用程序不同所使用格式可 能会有细微的区别。 位图头 这部分是识别信息, 典型的应用程序会首先普通读取这部分数据以确保的确是位 图文件并且没有损坏。
BMP 文件大小 度(width)都以像素为单位。 需要注意的是上面公式中的 54 是位图文件的文件头,
, 其中高度(height)和宽
是彩色调色板的大
小。 如果位图文件不包含调色板,如 24 位,32 位位图,则位图的近似字节数 可以用下面的公式计算:
BMP 文件大小 都以像素为单位。
,其中高度(height)和宽度(wimp 文件格式的描述,就不难发现,读取 bmp 大致只需要用到 fseek,fopen,fread 等函数即可以完成,下面我给出相应的 C 代码,读取的图像头文件信息主要是 offset,width,height,数据信息主要是 r[][],g[][],b[][],同时把数据输出到相应的 txt 文件中。
FILE *fpbmp; FILE *fpout;
fpbmp= fopen("1.bmp", "rb"); if (fpbmp == NULL) { printf("Open bmp failed!!!\n"); return 1; }
fpout= fopen("out.bmp", "wb+"); if (fpout == NULL) { printf("Open out.bmp failed!!!\n"); return 1; }
BMP文件结构读写操作(图文)_c实现
BITMAPFILEHEADER结构的各个域详细说明如下:bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
bfOffBits:从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。
有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。
对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为个字节;而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。
第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
2.BMP文件的存盘给定图像路径名以及图像的数据,对图像的写操作也是按照BMP文件4个组成部分进行分别处理的。
其基本流程如图1-9所示。
该main()函数将指定BMP文件读入内存,将图像信息打印输出,最后又原样存入指定文件中。
读者可以打开程序当前目录下的“dog.bmp”和“dogcpy.bmp”两个文件进行对比。
以上对于BMP文件的读写函数仅针对灰度图像(biBitCount=8)和彩色图像(biBitCount=24)两种格式,对于其他如biBitCount=1的图像类型,读者可以根据需要,自己对程序作简单的修改即可实现。
本书中后续的代码实现也都是围绕灰度和彩色两种格式进行的,希望读者予以注意。
BMP文件结构读写操作(图文)
BMP文件结构读写操作(图文)预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制BITMAPFILEHEADER结构的各个域详细说明如下:bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
的大小为,图像中有分量相等,整个颜色表的大小为第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
2.BMP文件的存盘给定图像路径名以及图像的数据,对图像的写操作也是按照BMP 文件4个组成部分进行分别处理的。
其基本流程如图1-9所示。
int biBitCount, RGBQUAD *pColorTable){//如果位图数据指针为0,则没有数据传入,函数返回if(!imgBuf)return 0;//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0int colorTablesize=0;if(biBitCount==8)colorTablesize=1024;//待存储图像数据每行字节数为4的倍数int lineByte=(width * biBitCount/8+3)/4*4;//以二进制写的方式打开文件FILE *fp=fopen(bmpName,"wb");if(fp==0) return 0;//申请位图文件头结构变量,填写文件头信息BITMAPFILEHEADER fileHead;fileHead.bfType = 0x4D42;//bmp类型//bfSize是图像文件4个组成部分之和fileHead.bfSize= sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)+ colorTablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;//bfOffBits是图像文件前3个部分所需空间之和fileHead.bfOffBits=54+colorTablesize;//写文件头进文件fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;head.biBitCount=biBitCount;head.biClrImportant=0;head.biClrUsed=0;head.biCompression=0;head.biHeight=height;head.biPlanes=1;head.biSize=40;head.biSizeImage=lineByte*height;head.biWidth=width;head.biXPelsPerMeter=0;head.biYPelsPerMeter=0;//写位图信息头进内存fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);//如果灰度图像,有颜色表,写入文件该main()函数将指定BMP文件读入内存,将图像信息打印输出,最后又原样存入指定文件中。
c语言读取bmp文件格式
//BMP 头
typedef struct
{
char id[2]; //bmp 文件标志 "BM"
unsigned long fileSize; //文件大小
unsigned long reserved0;
{
case 8:
palIndex = *buf_p++;
*pixbuf++ = bmpHeader.palette[palIndex][2];
*pixbuf++ = bmpHeader.palette[palIndex][1];
}
void __stdcall Com_Error(const char *fmt, ... )
{
char com_errorMessage[4096];
va_list argptr;
va_start (argptr,fmt);
vsprintf (com_errorMessage,fmt,argptr);
columns = (columns & ~3) + 4; //修正位图宽度值,对齐到4的倍数,不然图像会变形
}
if ( rows < 0 )
rows = -rows;
numPixels = columns * rows;
buf_p = buffer+54;
for ( row = rows-1; row >= 0; row--)
{
pixbuf = bmpRGBA + row*columns*4;
for ( column = 0; column < columns; column++ )
读取BMP文件的C++程序
uvar32 Size,Offset,Height,Width,Compress,Reserved, InfoHeaderSize,Colors,ImportantColors,DataSize,HResolution,VResolution; uvar16 Planes,Bit; int i,j; var8 type[2],imdata[256][256]; Palette Rgbquad; ifstream fin; fin.open("cameraman.bmp",ios::binary); /*以二进制读方式打开该文件,一定要二进制的!*/ if(!fin) {
cout<<"VResolution: "<<VResolution<<endl; /*用象素/米表示的垂直分辨率,偏移量 42,VResolution: 0*/ fin.read((char*)&Colors,sizeof(uvar32)); cout<<"Colors: "<<Colors<<endl; /*位图使用的颜色数,256 色,偏移量 46,Colors: 256*/ fin.read((char*)&ImportantColors,sizeof(uvar32)); cout<<"ImportantColors: "<<ImportantColors<<endl; /*指定重要的颜色数。当该域的值等于颜色数时(或者等于 0 时), 表示所有颜色都一样重要。偏移量 50,ImportantColors: 0*/ for(i=0;i<256;i++) {
bmp文件读写操作
实验一BMP文件的读写操作一、实验目的与要求1.熟悉及掌握在MATLAB中能够处理哪些位图文件。
2.熟练掌握在MATLAB中如何读取位图文件。
3.掌握如何利用MATLAB来获取位图文件的大小、颜色、高度、宽度等等相关信息。
4.掌握如何在MATLAB中按照指定要求存储一幅位图文件的方法。
5.图像间如何转化。
二、实验原理及知识点1.位图文件的分类及结构位图是通过许多像素点表示一幅图像,每个像素具有颜色属性和位置属性。
位图可以分成如下四种:线画稿 、灰度图像、索引颜色图像和真彩色图像。
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。
Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。
Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP 位图文件。
BMP 位图文件默认的文件扩展名是BMP 或者bmp 。
由四部分组成,其结构如图1所示。
图1 BMP 文件结构图2. MATLABMATLAB 是由美国MathWorks 公司推出的用于数值计算的有力工具, 它具有相当强大的矩阵运算和操作功能,一幅数字图像在MATLAB 中可以很自然的表示成矩阵,如图2,一幅M ×N 个像素的数字图像,其像素灰度值可以用M 行、N 列的矩阵G 表示:图2数字图像的矩阵的表示并且MATLAB 图像处理工具箱(IPT )提供了丰富的图像处理函数,这些函数处理的是多维数组,而图像(二维数值数组)正是多维数组的一种特例。
灵活运用这些函数几乎可以完成所有的图像处理工作,⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=MN M M N N g g g g g g g g g G 212222111211从而大大节省编写低层算法代码的时间,避免程序设计中的重复劳动,达到事半功倍的效果。
c++读取BMP文件(24位)
char fname_bmp[128]; sprintf(fname_bmp, "%s.bmp", filename);
FILE *fp; if (!(fp = fopen(fname_bmp, "wb")))
return -1;
fwrite(header, sizeof(unsigned char), 54, fp);
****************************************************************************/ int youwritetobmp(RGBQUAD *pixarr, int xsize, int ysize, char *filename){
fclose(fp); return 0; }
void clonebmp(unsigned char *image,int xsize,int ysize) {
bmp_read(image, xsize, ysize, ".\\1"); bmp_write(image, xsize, ysize, ".\\2"); }
if (image == NULL) return -1;
clonebmp(image,xsize,ysize);
//功能一:实现一副图像的拷贝
//youwritetobmp(pixarray,xsize,ysize,"yourimage");//功能二:实现像素的精确绘制,像素值 在 pixarray 数组中
unsigned char header[54] ={ 0x42, 0x4d, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
C语言BMP图片处理
C语言 BMP图片处理BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。
它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。
在系统中以BMP为扩展名保存。
打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、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色图像为1024字节。
其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(像素的透明度值,一般不需要)。
BMP图像的读写(8位和24位)要点
南通大学计算机科学与技术学院《数字图像处理》课程实验报告书实验名 BMP文件的读写(8位和24位)班级计 121姓名张进学号 12130220162014年6月 16 日一、实验内容1、了解BMP文件的结构2、8位位图和24位位图的读取二、BMP图形文件简介BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP 图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成结构名称符号位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh位图信息头(bitmap-information header) BITMAPINFOHEADER bmih彩色表(color table) RGBQUAD aColors[]图象数据阵列字节BYTE aBitmapBits[]位图文件结构内容摘要偏移量域的名称大小内容图象文件头0000h 文件标识 2 bytes两字节的内容用来识别位图的类型:‘BM’: Windows 3.1x, 95, NT, …‘BA’:OS/2 Bitmap Array‘CI’:OS/2 Color Icon‘CP’:OS/2 Color Pointer‘IC’: OS/2 Icon‘PT’:OS/2 Pointer注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识“BM”就行。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BITMAPFILEHEADER结构的各个域详细说明如下:
bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
的大小为
,图像中有
分量相等,整个颜色表的大小为
第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。
2.BMP文件的存盘
给定图像路径名以及图像的数据,对图像的写操作也是按照BMP文件4个组成部分进行分别处理的。
其基本流程如图1-9所示。
该main()函数将指定BMP文件读入内存,将图像信息打印输出,最后又原样存入指定文件中。
读者可以打开程序当前目录下的“dog.bmp”和“dogcpy.bmp”两个文件进行对比。
以上对于BMP文件的读写函数仅针对灰度图像(biBitCount=8)和彩色图像(biBitCount=24)两种格式,对于其他如biBitCount=1的图像类型,读者可以根据需要,自己对程序作简单的修改即可实现。
本书中后续的代码实现也都是围绕灰度和彩色两种格式进行的,希望读者予以注意。