bmp文件读取源码
bmp图像哈弗曼编码和解码源代码

HuffmanCode.h#ifndef CHUFFMAN#define CHUFFMAN 1// 二叉树结点struct SNode {unsigned long m_freq; // 频率int m_len; // 深度,编码长度SNode * m_pPar; // 父结点SNode * m_pLeft; // 左结点SNode * m_pRight; // 右结点char * m_code; // 字节编码SNode (){m_len = 0;m_freq = 0;m_code = 0;m_pPar = 0;m_pLeft = 0;m_pRight = 0;}};// 哈夫曼编码类(只为文件类型而写,对每个字节出现概率进行统计编码)// 编码使用方法,先Clear()清空。
Add()将各字节加入,CreateCode()完成编码,使用GetCode()或AppendCode()获取编码// 解码使用方法,先Clear()清空。
CreateTree()创建编码,使用GetData()将编码转换为对应的字节class CHuffmanCode{public:CHuffmanCode() {m_head = 0; Clear();}~CHuffmanCode() {DestoryNode(m_head);}void Clear(); // 清空计数int GetCodeNum() {return m_iCodeNum;}void Add(unsigned char n); // 将字节加入void CreateCode(); // 编码int GetCode(unsigned char n, char* buf, int len); // 获取编码,编码将以'0''1'的字符串形式返回,len缓冲区长度,返回编码长度int GetCodeLen(unsigned char n); // 获取编码长度// 将以'0''1'的字符串形式的编码循环写入buf,从rBegin位置开始写,len为缓冲区长度,超出长度则返回0位置开始写,// 函数执行完成后,rBegin指向下一待写入位置。
C语言读取BMP图像数据的源码

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图像的读和写和对像素的操作

#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;}。
用c语言读取并显示bmp图像1

如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?下面的是<<C & C++编程实例>>随书光盘上的代码,我在TC2.0下编译通过.它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.不过,我想问下,你老师教过抖动显示吗?#include <stdio.h>#include <dos.h>#include <stdio.h>#include <conio.h>#define NoError 0#define ErrorFileOpen 1#define ErrorFileType 2#define ErrorImageColor 3typedef struct tagBITMAPFILEHEADER{unsigned int bfType;unsigned long bfSize;unsigned int bfReserved1;unsigned int bfReserved2;unsigned long bfoffBits;}BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER{unsigned long biSize;unsigned long biWidth;unsigned long biHeight;unsigned int biPlanes;unsigned int biBitCount;unsigned long biCompression;unsigned long biSizeImage;unsigned long biXPelsPerMeter;unsigned long biYPelsPerMeter;unsigned long biClrUsed;unsigned long biClrImportant;} BITMAPINFOHEADER;typedef struct tagRGBQUAD{unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;unsigned char rgbReserved;} RGBQUAD;unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0}; unsigned char StandardPal[48]= {0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 32, 48, 48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,63,63, };unsigned char LightnessMatrix [16][16]= {{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},};unsigned char ColorTable[2][2][2]= {{{0,12},{10,14}},{{9,13},{11,15}}}; unsigned char ColorMap[256][3];int ShowBmp(char *FileName);int GetColor(unsigned char R,unsigned char G, unsigned char B,int X,int Y); void SetVideoMode(unsigned char Mode);void SetPalReg(unsigned char *palReg);void SetDacReg(unsigned char *DacReg, int Color, int Count);void PutPixel(int X, int Y, unsigned char Color);/* 主函数*/void main (int argc, char *argv[]){if(argc!=2){printf("Usage:\tSHOW Filename.BMP\n");exit(1);}ShowBmp(argv[1]);}/* 根据图像文件名,读取图像内容并利用抖动技术进行显示*/ int ShowBmp(char *FileName){FILE *Fp;BITMAPFILEHEADER FileHead;BITMAPINFOHEADER InfoHead;RGBQUAD RGB;int N, W,Y,X,C,Color;unsigned char Buffer[4096];Fp=fopen(FileName,"rb");if (Fp==NULL)return(ErrorFileOpen);fread(&FileHead,sizeof(BITMAPFILEHEADER),1,Fp);if(FileHead.bfType!='BM'){fclose(Fp);return(ErrorFileType);}fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,Fp);if(InfoHead.biBitCount!=8 && InfoHead.biBitCount!=24){fclose(Fp);return(ErrorImageColor);}/* 设置显示模式和显示区域*/SetVideoMode(0x12);SetPalReg(PalReg);SetDacReg(StandardPal,0,16);/* 对两种不同色彩数的图像分别进行处理*/if(InfoHead.biBitCount==8) /* 256色*/{for (N=0;N<256;N++){fread(&RGB, sizeof(RGBQUAD),1,Fp);ColorMap[N][0]=RGB.rgbRed;ColorMap[N][1]=RGB.rgbGreen;ColorMap[N][2]=RGB.rgbBlue;}W=(InfoHead.biWidth+3)/4*4;for(Y=InfoHead.biHeight-1;Y>=480;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for (X=0;X<InfoHead.biWidth && X<640;X++){C=Buffer[X];Color=GetColor(ColorMap[C][0],ColorMap[C][1],ColorMap[C][2],X,Y); PutPixel (X,Y,Color);}}}else /* 24bits真彩色*/{W=(InfoHead.biWidth*3+3)/4*4;for(Y=InfoHead.biHeight-1;Y>639;Y--)fread(Buffer,sizeof(unsigned char),W,Fp);for(;Y>=0;Y--){fread(Buffer,sizeof(unsigned char),W,Fp);for(X=0;X<InfoHead.biWidth && X<640;X++){C=X*3;Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[C],X,Y);PutPixel(X,Y,Color);}}}getch();fclose(Fp);SetVideoMode(0x03);return(NoError);}int GetColor(unsigned char R, unsigned char G, unsigned char B, int X, int Y) {unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F];return(ColorTable[(unsigned int)R*256/255>L][(unsigned int)G*256/255>L][(unsigned int)B*256/255>L]); }void SetVideoMode(unsigned char Mode){_AH=0x00;_AL=Mode;geninterrupt(0x10);}void SetPalReg(unsigned char *PalReg){_ES=FP_SEG((unsigned char far*)PalReg);_DX=FP_OFF((unsigned char far*)PalReg);_AX=0x1002;geninterrupt(0x10);}void SetDacReg(unsigned char *DacReg,int Color,int Count){_ES=FP_SEG((unsigned char far*)DacReg);_DX=FP_OFF((unsigned char far*)DacReg);_AX=0x1012;_BX=Color;_CX=Count;geninterrupt(0x10);}/* 在对应位置显示像素色彩*/void PutPixel(int X, int Y, unsigned char Color){_AH=0x0C;_AL=Color;_CX=X;_DX=Y;geninterrupt(0x10);}16色位图的显示文:吴进/Luckylai对于象大家常用TC的16色图形模式编程的初学者,如果能在程序里使用图片那就会方便很多了,以前在TC256上看见吴进写的《TC的16色BMP闪电显示(66k) 》的代码,发现写的的确不错,而且绝对能在TC的initgraph()初始化的BGI模式下使用。
bmp文件的读写

bmp文件的读写 - zhangwenjianqin的专栏 - 博客频道 - #include "stdio.h"#include "stdlib.h"#define PIXPLINE 320typedef struct tagRGBQUAD{ //定义每个像素的数据类型unsigned char rgbBlue;unsigned char rgbGreen;unsigned char rgbRed;} RGBQUAD;int bmp_read(unsigned char *image, int xsize, int ysize, char *filename) {char fname_bmp[128];sprintf(fname_bmp, "%s.bmp", filename);FILE *fp;if (!(fp = fopen(fname_bmp, "rb")))return -1;unsigned char header[54];fread(header, sizeof(unsigned char), 54, fp);fread(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp);fclose(fp);return 0;}int bmp_write(unsigned char *image, int xsize, int ysize, char *filename) {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};long file_size = (long)xsize * (long)ysize * 3 + 54;header[2] = (unsigned char)(file_size &0x000000ff); header[3] = (file_size >> 8) & 0x000000ff;header[4] = (file_size >> 16) & 0x000000ff;header[5] = (file_size >> 24) & 0x000000ff;long width = xsize;header[18] = width & 0x000000ff;header[19] = (width >> 8) &0x000000ff;header[20] = (width >> 16) &0x000000ff;header[21] = (width >> 24) &0x000000ff;long height = ysize;header[22] = height &0x000000ff;header[23] = (height >> 8) &0x000000ff;header[24] = (height >> 16) &0x000000ff;header[25] = (height >> 24) &0x000000ff;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);fwrite(image, sizeof(unsigned char), (size_t)(long)xsize * ysize * 3, fp);fclose(fp);return 0;}void clonebmp(unsigned char *image,int xsize,int ysize){bmp_read(image, xsize, ysize, "orgbmp"); //orgbmp为当前目录下的bmp文件名 bmp_write(image, xsize, ysize, "clone_bmp");//clone_bmp为克隆的bmp文件名}/***************************************************************************** 名称:youwritetobmp()* 功能:写入bmp文件* 入口参数:RGBQUAD *pixarr ---- 要写入的像素数组指针, int xsize ---- 图像宽度, int ysize ---- 图像高度, char *filename --图像名称* 出口参数:无* 返回值:-1:错误;0:正确****************************************************************************/int youwritetobmp(RGBQUAD *pixarr, int xsize, int ysize, char *filename) {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};int i;int j;long file_size = (long)xsize * (long)ysize * 3 + 54;header[2] = (unsigned char)(file_size &0x000000ff);header[3] = (file_size >> 8) & 0x000000ff;header[4] = (file_size >> 16) & 0x000000ff;header[5] = (file_size >> 24) & 0x000000ff;long width;if(!(xsize%4)) width=xsize;else width= xsize+(4-xsize%4); //如不是4的倍数,则转换成4的倍数 header[18] = width & 0x000000ff;header[19] = (width >> 8) &0x000000ff;header[20] = (width >> 16) &0x000000ff;header[21] = (width >> 24) &0x000000ff;long height = ysize;header[22] = height &0x000000ff;header[23] = (height >> 8) &0x000000ff;header[24] = (height >> 16) &0x000000ff;header[25] = (height >> 24) &0x000000ff;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);RGBQUAD zero={0,0,0}; //不足字节,用zero填充for(j=0;j<ysize;j++){if(!(xsize%4)){for(i=0;i<xsize;i++){fwrite(pixarr+i, sizeof(RGBQUAD),1, fp);}}else{for(i=0;i<xsize;i++){fwrite(pixarr+i, sizeof(RGBQUAD),1, fp);}for(i=xsize;i<xsize+(4-xsize%4);i++){fwrite(&zero, sizeof(RGBQUAD),1, fp);}}}fclose(fp);return 0;}int main() {unsigned char *image;int xsize = 320;int ysize = 163;RGBQUAD pixarray[PIXPLINE]; //一行像素值数组image = (unsigned char *)malloc((size_t)xsize * ysize * 3);if (image == NULL)return -1;clonebmp(image,xsize,ysize); //功能一:实现一副图像的拷贝youwritetobmp(pixarray,xsize,ysize,"yourimage");//功能二:实现像素的精确绘制,像素值在pixarray数组中free(image);return -1;}查看文档来源:file:///D:/TDDOWNLOAD/%E7%BD%91%E9%A1%B5/bmp%E6%96%87%E4%BB%B6%E7 %9A%84%E8%AF%BB%E5%86%99.htm。
读取bmp图像所有像素点的RGB值的函数实现

读取bmp图像所有像素点的RGB值的函数实现:void pixHandle(char* bmpName){int r[bmpHeight][bmpWidth];int g[bmpHeight][bmpWidth];int b[bmpHeight][bmpWidth];readBmp(bmpName);cout<<"width="<<bmpWidth<<endl<<" height="<<bmpHeight<<endl<<" BitCount="<<biBitCount<<endl;int lineByte = (bmpWidth * biBitCount/8 + 3)/4 * 4;int n=0;if(biBitCount == 8) //灰度图像{for(int i=0;i<bmpHeight;i++){for(int j=0;j<lineByte;j++){r[i][j]=*(pBmpBuf + i*lineByte + j);g[i][j]=*(pBmpBuf + i*lineByte + j);b[i][j]=*(pBmpBuf + i*lineByte + j);n++;}}}else if(biBitCount == 24) //彩色图像{for(int i=0;i<bmpHeight;i++){for(int j=0;j<bmpWidth;j++){for(int k=0;k<3;k++){if(k==0){b[i][j]=*(pBmpBuf + i*lineByte + j*3 + k);}if(k==1){g[i][j]=*(pBmpBuf + i*lineByte + j*3 + k);}if(k==2){r[i][j]=*(pBmpBuf + i*lineByte + j*3 + k);}}n++;}}}cout<<"总的像素个数为:"<<n<<endl;ofstream outfile("图像像素的rgb分量.txt",ios::out | ios::trunc ); if(!outfile){cout<<"Open error!"<<endl;}for(int i=0;i<bmpHeight;i++){for(int j=0;j<bmpWidth;j++){if(j%bmpWidth==0){outfile<<endl;}outfile<<r[i][j]<<" ";}}outfile<<endl;for(int i=0;i<bmpHeight;i++){for(int j=0;j<bmpWidth;j++){if(j%bmpWidth==0){outfile<<endl;}outfile<<g[i][j]<<" ";}}outfile<<endl;for(int i=0;i<bmpHeight;i++){for(int j=0;j<bmpWidth;j++){if(j%bmpWidth==0){outfile<<endl;}outfile<<b[i][j]<<" ";}}outfile.close();}读取卫星小图片(针对3.1.3节输出的RGB三个结果矩阵)高度坐标的完整程序如下:#include <iostream>#include <vector>#include <string>#include <fstream>#include <cmath>#include <sstream>using namespace std;int bmpHeight=17;int bmpWidth=16;double height[17][16];typedef unsigned char BYTE;typedef vector< vector<BYTE> > Mat;struct colorTable{BYTE red;BYTE green;BYTE blue;double height;};void getHeight(Mat &r,Mat &g,Mat &b,colorTable *color); Mat input(const char *nameFile);int getMin(float *a);int main(){Mat r=input("red.txt");Mat g=input("green.txt");Mat b=input("blue.txt");colorTable color[31];for(int i=0;i<31;++i)//color[31]的初始化{if(i<=15){color[i].red=0;color[i].green=0+17*i;color[i].blue=255-17*i;}else{color[i].red=0+(i-15)*17;color[i].green=255-(i-15)*17;color[i].blue=0;}color[i].height=i*21.7;}getHeight(r,g,b,color);for(int i=0;i<bmpHeight;++i){for(int j=0;j<bmpWidth;++j)cout<<height[i][j]<<" ";cout<<endl;}ofstream out("high.txt",ios::out);for(int i=0;i<bmpHeight;++i){for(int j=0;j<bmpWidth;++j)out<<height[i][j]<<" ";out<<endl;}return 0;}void getHeight(Mat &r,Mat &g,Mat &b,colorTable *color){float a[31];//获取每像素点的高度坐标for(int i=0;i<bmpHeight;++i){for(int j=0;j<bmpWidth;++j){for(int k=0;k<31;++k){a[k]=sqrt((r[i][j]-color[k].red)*(r[i][j]-color[k].red)+(g[i][j]-color[k].green)*(g[i][j]-color[k].green)+(b[i][j]-color[k].blue)*(b[i][j]-color[k].blue));}int index=getMin(a);height[i][j]=color[index].height;}}}Mat input(const char *nameFile){ifstream in(nameFile,ios::in);Mat a;istringstream iss;string str;vector<BYTE> tmpvec;while(getline(in,str)){iss.str(str);BYTE tmp;while(iss>>tmp){tmpvec.push_back(tmp);}a.push_back(tmpvec);tmpvec.clear();iss.clear();}return a;}int getMin(float *a){int index=0;float min=a[0];for(int i=1;i<31;++i){if(a[i]<min){min=a[i];index=i;}}return index;}上述程序运行后输出高度矩阵的结果如下:151.9 477.4 151.9 151.9 477.4 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 477.4 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 477.4 477.4 151.9 477.4 151.9 151.9 477.4 477.4 151.9 477.4 477.4 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 477.4 477.4 151.9 151.9 151.9 151.9 477.4 477.4 151.9 477.4 477.4 151.9 151.9 477.4 151.9 151.9 151.9 477.4 477.4 477.4 151.9 477.4 477.4 477.4 477.4 477.4 477.4 477.4 151.9 477.4 477.4 151.9 151.9 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 477.4 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 151.9 477.4 151.9 151.9 477.4 151.9 151.9 151.9 151.9 151.9 477.4 477.4 151.9 151.9 477.4 151.9 477.4 477.4 151.9 477.4 151.9 151.9 477.4 151.9 151.9 说明程序运行成功。
BMP文件的读写

• lpszFilter是一个包含有通配符的以“|”字符分隔的字符 串。要注意的是, 在第一个“|”字符之前是将要显示在 文件对话框的“文件类型”列表框中的信息, 第二个
“ | ”字符和第一个“ | ”字符之间的内容为对话框的过
滤器内容。在字符串szFilter的尾部, 使用两个“|”字符
而不是一个, 表示过滤器内容结束。
StretchDIBits函数简介
• • • • • • • • • • • • hdc:指向目标设备环境的句柄。 XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。 YDest:指定目标矩形左上角的Y轴坐标,按逻辑单位表示坐标。 nDestWidth:指定目标矩形的宽度。 nDestHeight:指定目标矩形的高度。 XSrc:指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示。 YSrc:指定DIB中源矩形(左上角)的Y轴坐标,坐标以像素点表示。 nSrcWidth:按像素点指定DIB中源矩形的宽度。 nSrcHeight:按像素点指定DIB中源矩形的高度。 lpBits:指向DIB位的指针,这些位的值按字节类型数组存储。 lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。 iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了, 那么该bmiColors是否包含了明确的RGB值或索引。参数iUsage必须取下列值, 这些值的含义如下: DIB_PAL_COLOR:表示该数组包含对源设备环境的 逻辑调色板进行索引的16位索引值。 DIB_RGB_COLORS:表示该颜色表 包含原义的KGB值。 dwRop:指定源像素点、目标设备环境的当前刷子和目标像素点是如何组合形成 新的图像。 返回值:如果函数执行成功,那么返回值是拷贝的扫描线数目,如果函数执行失 败,那么返回值是GDI_ERROR。 备注:。参数iUsage一般设为DIB_RGB_COLORS。dwRop一般设为SRCCOPY 。
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);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BOOL CBmp::loadBitmapFile(CString
path,CBitmap&bitmap)
{
CFile file;
if( !file.Open(path, CFile::modeRead) )
return FALSE;
BITMAPFILEHEADER bmfHeader;
long fileLen = file.GetLength();
if(file.Read(&bmfHeader,sizeof(bmfHeader)) !=
sizeof(bmfHeader))
return FALSE;
if(bmfHeader.bfType != 0x4d42)
return FALSE;
HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED,fileLen);
if(hDIB == 0)
return FALSE;
if(file.Read(hDIB,fileLen -
sizeof(BITMAPFILEHEADER)) !=
fileLen - sizeof(BITMAPFILEHEADER) )
{
::GlobalFree(hDIB);
return FALSE;
}
BITMAPINFO &bmInfo =
*(LPBITMAPINFO)::GlobalLock(hDIB);
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB;
int headerSize = sizeof(BITMAPINFOHEADER);
BYTE *pBmpPixelBuffer=(BYTE
*)&bmInfo+bmfHeader.bfOffBits –
sizeof(BITMAPFILEHEADER);
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
HBITMAP hBitmap;
hBitmap =
CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER
*)&bmInfo,CBM_INIT,(VOID*)pBmpPixelBuffer,&bmInfo,DI B_RGB_COLORS);
bitmap.Attach(hBitmap);
::GlobalUnlock (hDIB);
::GlobalFree(hDIB);
return TRUE;
throw(gcnew System::NotImplementedException);
}
BOOL CBmp::bmpSave(CBitmap& m_bitmap, CString filename)
{
BITMAP bm;
m_bitmap.GetBitmap(&bm);
int nWidth = bm.bmWidth;//每行的像素数
int nHeight = bm.bmHeight;//列的像素数
int nLineBits = bm.bmWidthBytes;//每行的像素数
if ((nLineBits % 4) != 0)
nLineBits += 4 - nLineBits%4;
int nBitCounts = nLineBits * bm.bmHeight;
int nBits = bm.bmBitsPixel;//每个像素的位数
int nBitmapinfoSize = 0;
if(nBits <= 8)
{
int nColor = 1 << nBits;
int nPalUnitSize = sizeof(RGBQUAD);
nBitmapinfoSize = sizeof(BITMAPINFOHEADER) + nPalUnitSize * nColor;
}
else
nBitmapinfoSize = sizeof(BITMAPINFOHEADER);
BITMAPINFO *pbmpinfo = NULL;
pbmpinfo = (BITMAPINFO*)(new
BYTE[nBitmapinfoSize]);
ZeroMemory((void *)pbmpinfo,nBitmapinfoSize);//将该段内存中的值初始化为
BITMAPINFOHEADER *pInfoHeader = (BITMAPINFOHEADER*)pbmpinfo;//BITMAPINFOHEADER的首地址与BITMAPINFO相同
ZeroMemory((void*)pInfoHeader,sizeof(BITMAPINFOHEADE R));
pInfoHeader->biSize = sizeof(BITMAPINFOHEADER); pInfoHeader->biWidth = nWidth;
pInfoHeader->biBitCount = nBits;
pInfoHeader->biPlanes = 1;
pInfoHeader->biSizeImage = nBitCounts;
pInfoHeader->biCompression = BI_RGB;
pInfoHeader->biHeight = nHeight;
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
int nLx = dc.GetDeviceCaps (LOGPIXELSX);
int nLy = dc.GetDeviceCaps (LOGPIXELSY);
double dbInchPerMeter = 39.375;
int nPMx = (int)((double)nLx * dbInchPerMeter);
int nPMy = (int)((double)nLy * dbInchPerMeter);
pInfoHeader->biXPelsPerMeter = nPMx;
pInfoHeader->biYPelsPerMeter = nPMy;
if(nBits <= 8)
{
int nColors = 1 << nBits;
GetDIBColorTable(dc.m_hDC,0,nColors,pbmpinfo->bmiCol ors);
}
BYTE* pBits = NULL;
HGLOBAL hGlobal
= ::GlobalAlloc(GMEM_FIXED,nBitCounts);//存储BITMAPINFO结构体
pBits = (BYTE*)::GlobalLock(hGlobal);
ZeroMemory((void*)pBits,nBitCounts);
GetDIBits(dc.m_hDC,(HBITMAP)m_bitmap,0,nHeight,pBits ,pbmpinfo,DIB_RGB_COLORS);
BITMAPFILEHEADER bmfHeader;
int nFileHeadSize = sizeof(BITMAPFILEHEADER);
ZeroMemory((void*)&bmfHeader,sizeof(BITMAPFILEHEADER ));
bmfHeader.bfType = 0x4d42;
bmfHeader.bfSize = nFileHeadSize + nBitmapinfoSize + nBitCounts;
bmfHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + nBitmapinfoSize;
CFile savetoFile;
if(!savetoFile.Open(filename,CFile::modeCreate| CFile::modeWrite))
return FALSE;
savetoFile.Write(&bmfHeader,sizeof(BITMAPFILEHEADER) );
savetoFile.Write(pbmpinfo,nBitmapinfoSize);
savetoFile.Write(pBits,nBitCounts);
savetoFile.Close();
::GlobalUnlock(hGlobal);
::GlobalFree(hGlobal);
delete[]pbmpinfo;
return TRUE;
}。