完整程序_C语言对BMP图像的读和写和对像素的操作
- 格式:doc
- 大小:35.50 KB
- 文档页数:3
C语⾔读取BMP图像数据的源码BMP是英⽂Bitmap(位图)的简写,它是Windows操作系统中的标准图像⽂件格式,能够被多种Windows应⽤程序所⽀持。
随着Windows操作系统的流⾏与丰富的Windows应⽤程序的开发,BMP位图格式理所当然地被⼴泛应⽤。
这种格式的特点是包含的图像信息较丰富,⼏乎不进⾏压缩,但由此导致了它与⽣俱⽣来的缺点--占⽤磁盘空间过⼤。
所以,⽬前BMP在单机上⽐较流⾏。
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作扩展名)。
位图⽂件结构表位图⽂件位图⽂件头 14 字节位图信息头 40 字节彩⾊表(调⾊板) 4N 字节位图数据 x 字节构件详解:位图⽂件头位图⽂件头包含⽂件类型、⽂件⼤⼩、存放位置等信息。
结构定义如下:typedef struct tagBITMAPFILEHEADER{UNIT bfType;DWORD bfSize;UINT bfReserved1;UINT bfReserved2;DWORD bfOffBits;}BITMAPFILEHEADER;其中:bfType 说明⽂件类型,在windows系统中为BM。
C语言实现BMP图像显示软件课程设计1.设计任务1.1利用C语言实现BMP格式图象文件的分析和显示。
主要内容包括:1)基本任务:完成BMP格式图像的显示,要求在提供的画布上循环的显示某一文件夹下面所有的BMP文件(支持所有BMP格式);2)拓展任务:实现图像的特效显示(淡入淡出,百页窗等)。
2. 基本思路要实现在画布上显示BMP图像,利用描点函数GFMSetPixels,逐个显示出BMP图像的点,最终构成一幅完整的图像。
3. 方案设计3.1 主要算法说明:主要方法:将不同像素的图像分别用不同的函数实现,即分别定义show1bit,show4bit,……show32bit等几个函数,再定义函数showbmp,按照需要显示的图像像素,决定调用相应的图像显示函数。
这么做可以使结构比较清晰,增强代码的可读性。
具体实现方法:(1)定义信息头结构变量(其中变量包含BMP图像的文件头和信息头:文件标识“BM”,文件大小,保留位,数据偏移,信息头长度,宽度,高度,面数,像素的位数,压缩类型,位图数据大小,水平分辨率,垂直分辨率,颜色数,重要颜色)(2)定义函数,读取文件头和信息头(3)定义各个像素BMP图像的显示函数3.2 程序框架设计总体流程4. 程序的部分源代码分析及介绍4.1 主要显示函数showbmpvoid showbmp(char *filename)//图像显示函数{FILE * fp;struct Filehead point;Readhead(filename,&point);//调用头信息读取函数获得图像头信息if((fp=fopen(filename,"rb"))==NULL){printf("can not open");exit(1);}switch(point.bmppix)//判断图像的颜色像素,决定使用哪个图像显示函数{case 1://若像素为1,调用1bit图像显示函数show1bit(filename,&point);break;//其余调用类似,这里省略}关键是利用图像信息头中的bmppix(像素位数)来判断应当调用哪个图像显示函数4.2 32bit图像显示函数void show32bit(char*filename,struct Filehead* point)//显示32bit图像的函数{FILE*fp;INT32U color;INT32U i,j;if((fp=fopen(filename,"rb"))==NULL){printf("can not open the file!");exit(1);}fseek(fp,point->remove,0);//跳过文件头信息头数据区for(i=0;i<point->bmpheight;i++){for(j=0;j<point->bmpwidth;j++){fread(&color,4,1,fp);//每次读取4个字节(即32bit)的数据 GFMSetPixels(color,j,point->bmpheight-i,1);}}fclose(fp);}关键是用fseek跳过信息头,还有注意BMP图像读取时是从左下角开始的。
//ReadBitMap //把printf要打印的内容写成函数调用的方式,尤其是像素数据信息,其他函数可以调用,编写一个可以调用像素数据信息的函数例子,并可以对像素数据信息修改 // #include #include #include #include #include #define WIDTHBYTES(bits) (((bits)+31)/32*4)
typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef long LONG;
//位图文件头信息结构定义 //其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息) typedef struct tagBITMAPFILEHEADER { DWORD bfSize; //文件大小 WORD bfReserved1; //保留字,不考虑 WORD bfReserved2; //保留字,同上 DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和 } BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下: typedef struct tagBITMAPINFOHEADER{ //public: DWORD biSize; //指定此结构体的长度,为40 LONG biWidth; //位图宽 LONG biHeight; //位图高 WORD biPlanes; //平面数,为1 WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32 DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩 DWORD biSizeImage; //实际位图数据占用的字节数 LONG biXPelsPerMeter; //X方向分辨率 LONG biYPelsPerMeter; //Y方向分辨率 DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER;
c语⾔解析bmp图⽚的实例⼼⾎来潮想了解下常⽤图⽚的格式解析,翻看了⼀些资料后,发现最简单的是bmp格式,所以先拿它开⼑。
BMP格式这种格式内的数据分为三到四个部分,依次是:⽂件信息头(14字节)存储着⽂件类型,⽂件⼤⼩等信息图⽚信息头(40字节)存储着图像的尺⼨,颜⾊索引,位平⾯数等信息调⾊板(由颜⾊索引数决定)【可以没有此信息】位图数据(由图像尺⼨决定)每⼀个像素的信息在这⾥存储⼀般的bmp图像都是24位,也就是真彩。
每8位为⼀字节,24位也就是使⽤三字节来存储每⼀个像素的信息,三个字节对应存放r,g,b三原⾊的数据,每个字节的存贮范围都是0-255。
那么以此类推,32位图即每像素存储r,g,b,a(Alpha通道,存储透明度)四种数据。
8位图就是只有灰度这⼀种信息,还有⼆值图,它只有两种颜⾊,⿊或者⽩。
⽂件信息头格式typedef struct tagBITMAPFILEHEADER {unsigned short bfType; // 19778,必须是BM字符串,对应的⼗六进制为0x4d42,⼗进制为19778unsigned int bfSize; // ⽂件⼤⼩unsigned short bfReserved1; // ⼀般为0unsigned short bfReserved2; // ⼀般为0unsigned int bfOffBits; // 从⽂件头到像素数据的偏移,也就是这两} BITMAPFILEHEADER;图⽚信息头格式typedef struct tagBITMAPINFOHEADER {unsigned int biSize; // 此结构体的⼤⼩int biWidth; // 图像的宽int biHeight; // 图像的⾼unsigned short biPlanes; // 1unsigned short biBitCount; // ⼀像素所占的位数,⼀般为24unsigned int biCompression; // 0unsigned int biSizeImage; // 像素数据所占⼤⼩, 这个值应该等于上⾯⽂件头结构中bfSize-bfOffBitsint biXPelsPerMeter; // 0int biYPelsPerMeter; // 0unsigned int biClrUsed; // 0unsigned int biClrImportant;// 0} BITMAPINFOHEADER;调⾊板信息这⾥需要根据⽂件信息头的bfOffBits是否等于54(由前⾯的固定14+40字节得出)来判断是否存在此调⾊板信息,如果是,则不存在;⼤于的话即存在。
昆明理工大学(数字图像处理)实验报告实验名称:VC6.0下bmp位图的读取与显示专业:电子信息科学与技术姓名:学号:成绩:[实验目的]掌握windows BMP格式位图文件的基本格式。
会使用VC++读取图像数据并显示。
[实验内容]1、在VC6.0环境下,生成MFC应用程序框架。
2、在已生成的应用程序中,加BMP位图读取与显示的代码,从已有文件中读取bmp格式文件并在视图中显示。
[实验原理]1 、 BMP 文件组成BMP 文件由文件头、位图信息头、颜色信息和图像数据四部分组成。
位图结构如下所示:2 、 BMP 文件头BMP 文件头数据结构含有BMP 文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:•typedef struct tagBITMAPFILEHEADER{•WORD bfType; //文件类型,必须是字符串”BM”•DWORD bfSize; //指定文件大小•WORD bfReserved1; //保留字,不考虑•WORD bfReserved2; //保留字,不考虑•DWORD bfOffBits; //从文件头到位图数据的偏移字节数•} BITMAPFILEHEADER3 、位图信息头typedef struct tagBITMAPINFOHEADER{DWORD biSize; //该结构的长度,40个字节LONG biWidth; //图像的宽度,单位是像素LONG biHeight; //图像的高度,单位是像素WORD biPlanes; //必须是1WORD biBitCount //颜色位数,如1,4,8,24DWORD biCompression; //压缩类型,如BI_RGB,BI_RLE4DWORD biSizeImage; //实际位图数据占用的字节数LONG biXPelsPerMeter; //水平分辨率LONG biYPelsPerMeter; //垂直分辨率DWORD biClrUsed; //实际使用的颜色数DWORD biClrImportant; //重要的颜色数} BITMAPINFOHEADER;4、调色板typedef struct tagRGBQUAD {BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;} RGBQUAD;用于存放图像的颜色。
BMP格式图像说明一、bmp文件总体结构位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它们的名称和符号如表6-01所示。
表6-01 BMP图像文件组成部分的名称和符号以下将分别说明:1、文件头:BITMAPFILEHEADER bmfh; //位图文件头typedef struct tagBITMAPFILEHEADER{UINT bfType; //文件标志DWORD bfSize; //文件大小UINT bfReserved1,bfReserved2;DWORD bfOffBits; //数据偏移}BITMAPFILEHEADER;具体说明:2、位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。
BITMAPINFO结构具有如下形式:typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors[256];//其中256表示8位灰度图像的颜色数} BITMAPINFO;信息头:BITMAPINFOHEADER bmih; //位图信息头typedef struct tagBITMAPINFOHEADER{DWORD biSize; //信息头大小。
40字节LONG biWidth,biHeight; //位图实际宽、高度。
WORD biPlanes; //WORD biBitCount; //位图每像素的位数。
DWORD biCompression; //DWORD biSizeImage; //位数据的大小(字节)LONG biXPelsPerMeter,biYPelsPerMeter; // DWORD biClrUsed; //DWORD biClrImprotant; //}BITMAPINFOHEADER;颜色表:typedef struct tagRGBQUAD {BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;} RGBQUAD;对于8位的灰度图,颜色表的值为:RGBQUAD bmiColors [256];for(i=0;i<256;i++){bmiColors [i].rgbBlue=(BYTE)i;bmiColors [i].rgbGreen=(BYTE)i;bmiColors [i].rgbRed=(BYTE)i;bmiColors [i].rgbReserved=(BYTE)0;}具体含义如下:3.像素数据:紧跟在彩色表之后的是图像数据字节阵列。
MFC打开和保存一幅bmp图片---编程流程打开一幅图片1.新建一个多文档的MFC应用程序.2.在_Doc.h文件的C_Doc类中增加如下成员变量;public:int numquad; //调色板数int flagOpen; //标志是否打开bmpBITMAPINFO* pbi; //记录图像细节BYTE* lpbuf; //图像数据RGBQUAD* quad; //调色板BITMAPFILEHEADER bf;//文件头BITMAPINFOHEADER bi; //信息头3.修改”打开”菜单项的响应函数;a.找到菜单资源b.在”打开”菜单项建立类向导,页面设置如下:选择“Add function”,然后单击“Edit Code”编辑代码如下:void CZhbDoc::OnFileOpen(){// TODO: Add your command handler code hereLPCTSTR lpszFilter="BMP Files(*.bmp)|*.bmp|任何文件|*.*||";CFileDialogdlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);CString filepath;CFile file;//打开文件对话框if(dlg.DoModal()==IDOK){filepath=dlg.GetPathName();if(file.Open(filepath,CFile::modeRead|CFile::shareDenyNone,NULL)==0){//读取文件失败AfxMessageBox("无法打开文件!",MB_OK,0);return;}//读取文件头file.Read(&bf,sizeof(bf));//判断是否是BMP文件if(bf.bfType!=0x4d42)//'BM'{AfxMessageBox("非BMP文件!",MB_OK,0);return;}//判断文件是否损坏if(file.GetLength()!=bf.bfSize){AfxMessageBox("文件已损坏,请检查!",MB_OK,0);return;}//读文件信息头file.Read(&bi,sizeof(bi));//计算调色板数目numquad=0;if(bi.biBitCount<24){numquad=1<<bi.biBitCount;}//为图像信息pbi申请空间pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numquad*sizeof( RGBQUAD));memcpy(pbi,&bi,sizeof(bi));quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));//读取调色板if(numquad!=0){file.Read(quad,sizeof(RGBQUAD)*numquad);}//为图像数据申请空间bi.biSizeImage=bf.bfSize-bf.bfOffBits;lpbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);//读取图像数据file.Read(lpbuf,bi.biSizeImage);//图像读取完毕,关闭文件,设置标志file.Close();flagOpen=1;}}4.在C_Veiw类中增加paint消息处理函数;a. 如下图:点击“add handler”,然后再点“edit existing”c.在处理函数里编写如下代码:void CZhbView::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: Add your message handler code hereCZhbDoc* pDoc = GetDocument(); //得到文档指针,注意,文档的命名是与工程名有关的!!不同的程序不一样.ASSERT_VALID(pDoc);//是否已打开某个BMP文件if(pDoc->flagOpen==1){//这个函数显示DIBSetDIBitsToDevice(dc.m_hDC, //DIB将输出的设备描述表0, //设备描述表中位图输出起始逻辑x地址0, //设备描述表中位图输出起始逻辑x地址pDoc->bi.biWidth, //DIB的宽度pDoc->bi.biHeight, //DIB的高度0, //DIB开始读取输出的像素数据的x位置0, //DIB开始读取输出的像素数据的y位置0, //DIB中像素的水平行号,它对应lpBits内存缓冲区第一行数据 pDoc->bi.biHeight, //DIB的行数,对应包含在由lpBits所指内存缓冲区中的数据pDoc->lpbuf, //包含像素数据的内存缓冲区的指针pDoc->pbi, //指向初始化了的BITMAPINFO数据结构的指针,描述了位图的大小和色彩数据DIB_RGB_COLORS); //指定是显示的颜色}Invalidate(FALSE);// Do not call CView::OnPaint() for painting messages}保存一幅图片1.修改”另存为”菜单项的响应函数;a找到菜单资源b在”另存为”菜单项建立类向导,页面设置如下:选择“Add function”,然后单击“Edit Code”代码如下:void CZhbDoc::OnFileSaveAs(){LPCTSTR lpszFilter="BMP Files(*.bmp)|*.bmp|任何文件|*.*||";CFileDialogdlg(FALSE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);if (dlg.DoModal()!=IDOK)return;CFile file;CFileException fe;if (!file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &fe)){// 失败ReportSaveLoadException(dlg.GetPathName(), &fe, TRUE, AFX_IDP_INVALID_FILENAME);return;}file.SeekToBegin();file.Write(&bf,sizeof(bf));file.Write(&bi,sizeof(bi));if(numquad!=0){file.Write(quad,sizeof(RGBQUAD)*numquad);}file.WriteHuge(lpbuf,bi.biSizeImage);file.Close();}。
c语言百叶窗代码bmp思路百叶窗效果对于美化界面和展示图片有着很好的效果,下面我们来探讨一下如何用C语言实现百叶窗效果,并以BMP图片格式为例进行演示。
首先,我们需要了解BMP图片格式。
BMP是一种常见的无损位图格式,它将图像数据和其它图像信息存储在一个文件中。
C语言中可以通过读取和写入文件的方式来操作BMP图片。
实现百叶窗效果的思路如下:1. 打开BMP文件,读取图像数据和相关信息。
2. 获取图像的宽度和高度,以及每个像素所占用的字节数。
3. 创建一个新的数组,用来存储处理后的图像数据。
4. 遍历图像的每一行,将每个像素的RGB值存储到新数组中。
5. 对新数组进行百叶窗效果处理。
可以通过按照一定的规律交换RGB值的方式来实现。
6. 将处理后的图像数据写入新的BMP文件中。
下面是一个简单的示例代码:```cinclude <stdio.h>include <stdlib.h>pragma pack(2) // 确保按照2字节对齐原则进行存储typedef struct {unsigned short bfType; // 文件类型,必须是"BM"unsigned int bfSize; // 文件大小unsigned short bfReserved1; // 保留字段unsigned short bfReserved2; // 保留字段unsigned int bfOffBits; // 文件数据偏移量} BMPFILEHEADER;typedef struct {unsigned int biSize; // 信息头大小int biWidth; // 图像宽度int biHeight; // 图像高度unsigned short biPlanes; // 图像平面数unsigned short biBitCount; // 每个像素的位数unsigned int biCompression; // 压缩类型unsigned int biSizeImage; // 图像大小int biXPelsPerMeter; // 水平分辨率int biYPelsPerMeter; // 垂直分辨率unsigned int biClrUsed; // 颜色索引数unsigned int biClrImportant; // 重要的颜色索引数} BMPINFOHEADER;int main() {char inputFile[] = "input.bmp";char outputFile[] = "output.bmp";FILE *fpInput, *fpOutput;BMPFILEHEADER fileHeader;BMPINFOHEADER infoHeader;// 打开输入文件fpInput = fopen(inputFile, "rb");if (fpInput == NULL) {printf("无法打开输入文件!\n");return 1;}// 读取文件头和信息头fread(&fileHeader, sizeof(BMPFILEHEADER), 1, fpInput);fread(&infoHeader, sizeof(BMPINFOHEADER), 1, fpInput);// 打开输出文件fpOutput = fopen(outputFile, "wb");if (fpOutput == NULL) {printf("无法创建输出文件!\n");fclose(fpInput);return 1;}// 写入文件头和信息头fwrite(&fileHeader, sizeof(BMPFILEHEADER), 1, fpOutput);fwrite(&infoHeader, sizeof(BMPINFOHEADER), 1, fpOutput);// 计算图像数据的大小和行字节数int rowSize = (infoHeader.biWidth *infoHeader.biBitCount + 7) / 8;int padding = (4 - (rowSize % 4)) % 4;int imageSize = rowSize * infoHeader.biHeight;// 分配存储图像数据的内存unsigned char *imageData = (unsigned char*)malloc(imageSize);if (imageData == NULL) {printf("内存分配失败!\n");fclose(fpInput);fclose(fpOutput);return 1;}// 读取图像数据fread(imageData, imageSize, 1, fpInput);// 进行百叶窗效果处理int count = infoHeader.biHeight / 20; // 百叶窗份数int stripHeight = infoHeader.biHeight / count; // 每一个百叶窗的高度for (int i = 0; i < infoHeader.biHeight; i += stripHeight) {int startY = i;int endY = i + stripHeight;// 处理每一个百叶窗for (int y = startY; y < endY; y++) {for (int x = 0; x < infoHeader.biWidth; x++) {// 获取当前像素的位置int pos = y * rowSize + x * (infoHeader.biBitCount / 8);// RGB值交换 - 这里可以根据具体的需求来调整像素交换的顺序unsigned char tmp = imageData[pos];imageData[pos] = imageData[pos + 1];imageData[pos + 1] = imageData[pos + 2];imageData[pos + 2] = tmp;}}}// 写入处理后的图像数据fwrite(imageData, imageSize, 1, fpOutput);// 释放内存并关闭文件free(imageData);fclose(fpInput);fclose(fpOutput);printf("百叶窗效果处理完毕!\n");return 0;}```本示例中,采用了一个比较简单的百叶窗效果处理方式,即按照指定份数分割图像的高度,然后在每一个百叶窗中,对每一个像素的RGB值进行交换。
编程高手之路—高手进阶--C中如何显示*.bmp文件1.*.bmp文件结构*.bmp文件和大多数图形文件一样,分为文件描述区(头文件信息)和图象存储区(象素数据)两部分。
而头文件信息中又包含了信息区和调色板区两部分,信息区又可以细分为文件信息区和图象信息区两部分。
这里以256色320*200的bmp图象为例。
头文件描述区的偏移长度是1078个字节,也就是说图象存储区是从文件偏移1078后开始读取的。
在头文件描述区中头信息区的偏移长度是54个字节,也就是说调色板数据区是从54-1078之间的1024字节。
在头信息区中文件信息区占14个字节而图象信息区占40字节。
(1)文件信息区typedef struct BMP_file{unsigned int bfType; //文件类型unsigned long bfSize; //bmp文件长度unsigned int Reserved1;unsigned int Reserved2;unsigned long bfOffset; //文件描述区长度,16色为118,256色为1078}bitmapfile;现在算一下,有3个int,2个long,正好3*2+2*4=14字节(2)图象信息区type struct BMP_info{unsigned long biSize;unsigned long biWidth;unsigned long biHeight;unsigned int biPlanes;unsigned int biBitCount;unsigned long biCompression;unsigned long biSizeImage;unsigned long biXplosPerMeter;unsigned long biYplosPerMeter;unsigned long biClrUsed;unsigned long biClrImportant;}bitmapinfo;现在算一下,2个int,9个long,正好是2+2*9*4=40字节。
#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);}。
#include
#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;
}