VC 实现将自绘图形输出为bmp文件

合集下载

用c语言实现bmp与pix相互转换

用c语言实现bmp与pix相互转换

用c语言实现bmp与pix相互转换BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板.我们需要做的是,新建PIX 文件后,用WINHEX打开,准备好模板文件,提取BMP中的颜色信息,粘贴到PIX文件的头文件中,然后保存即可#include "stdio.h"#include "conio.h"main(){FILE *fp1,*fp2,*fp3;char ch,t[100][100][3];long j,i,k;fp1=fopen("e:\\work.bmp","r");fp2=fopen("e:\\work.pix","r");fp3=fopen("e:\\test.pix","w");for(j=1;j<=54;j++){ch=fgetc(fp1);}for(i=1;i<=36352;i++){ch=fgetc(fp2);fputc(ch,fp3);}for(j=1;j<=30000;j++){ch=fgetc(fp2);}for(j=0;j<=99;j++){for(i=0;i<=99;i++){for(k=0;k<=2;k++){ch=fgetc(fp1);t[99-j][i][k]=ch;}}}for(k=0;k<=2;k++){for(j=0;j<=99;j++){for(i=0;i<=99;i++){ch=t[j][i][k];fputc(ch,fp3);}}}for(j=1;j<=4304;j++){ch=fgetc(fp2);fputc(ch,fp3);}}。

VC数字图像处理编程之一----BMP图像的基本操作

VC数字图像处理编程之一----BMP图像的基本操作

上一讲我们主要介绍了图像的格式,其中重点说明了BMP文件的存储格式,同时对JEPG和GIF等常用格式作了简单的介绍。

本节主要讲述如何操作BMP文件,如对其读、写和显示等。

在实现数字图象处理的过程中,主要是通过对图像中的每一个像素点运用各种图像处理算法来达到预期的效果,所以进行图像处理的第一步,也是我们最关心的问题,是如何得到图像中每一个像素点的亮度值;为了观察和验证处理的图像效果,另一个需要解决的问题是如何将处理前后的图像正确的显示出来。

我们这章内容就是解决这些问题。

随着科技的发展,图像处理技术已经渗透到人类生活的各个领域并得到越来越多的应用,但是突出的一个矛盾是图像的格式也是越来越多,目前图像处理所涉及的主要的图像格式就有很多种,如TIF、JEMP、BMP等等,一般情况下,为了处理简单方便,进行数字图像处理所采用的都是BMP格式的图像文件(有时也称为DIB格式的图像文件),并且这种格式的文件是没有压缩的。

我们通过操作这种格式的文件,可以获取正确显示图像所需的调色板信息,图像的尺寸信息,图像中各个像素点的亮度信息等等,有了这些数据,开发人员就可以对图像施加各种处理算法,进行相应的处理。

如果特殊情况下需要处理其它某种格式的图像,如GIF、JEMP等格式的图象文件,可以首先将该格式转换为BMP格式,然后再进行相应的处理。

这一点需要读者清楚。

BMP格式的图像文件又可以分为许多种类,如真彩色位图、256色位图,采用RLE(游程编码)压缩格式的BMP位图等等。

由于在实际的工程应用和图像算法效果验证中经常要处理的是256级并且是没有压缩的BMP灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式,所以我们在整个讲座中范例所处理的文件格式都是BMP灰度图像。

如果读者对这种格式的位图能够作到熟练的操作,那么对于其余形式的BMP位图的操作也不会很困难。

BMP灰度图像作为Windows环境下主要的图像格式之一,以其格式简单,适应性强而倍受欢迎。

vc实现图片格式的转换

vc实现图片格式的转换

VC实现:bmp转jpg、jpg转bmp、截屏保存jpg2009年11月12日星期四 09:21需要GDI+,如果没有请看:vc6.0 下设置GDI+int GetEncoderClsid(const WCHAR* format, CLSID* pClsid){UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytesImageCodecInfo* pImageCodecInfo = NULL;GetImageEncodersSize(&num, &size);if(size == 0)return -1; // FailurepImageCodecInfo = (ImageCodecInfo*)(malloc(size));if(pImageCodecInfo == NULL)return -1; // FailureGetImageEncoders(num, size, pImageCodecInfo);for(UINT j = 0; j < num; ++j){if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ){*pClsid = pImageCodecInfo[j].Clsid;free(pImageCodecInfo);return j; // Success}}free(pImageCodecInfo);return -1; // Failure}/****************BMP转JPG*********用法示例**************************Bitmap newbitmap(L"d:\\d.bmp");//加载BMPconst unsigned short *pFileName=L"d:\\new.jpg";//保存路径SaveFile(&newbitmap,pFileName );************************************************************/void SaveFile(Bitmap* pImage, const wchar_t* pFileName)//{EncoderParameters encoderParameters;CLSID jpgClsid;GetEncoderClsid(L"image/jpeg", &jpgClsid);encoderParameters.Count = 1;encoderParameters.Parameter[0].Guid = EncoderQuality;encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;encoderParameters.Parameter[0].NumberOfValues = 1;// Save the image as a JPEG with quality level 100.ULONG quality;quality = 100;encoderParameters.Parameter[0].Value = &quality;Status status = pImage->Save(pFileName, &jpgClsid,&encoderParameters);if (status != Ok){wprintf(L"%d Attempt to save %s failed.\n", status, pFileName); }}// 将当前屏幕保存成为jpg图片// 参数 xs = 图象x岽笮? ys = 图象y轴大小, quality = jpeg图象质量voidSaveCurScreenJpg(LPCWSTR pszFileName, int xs, int ys, int quality) {HWND hwnd = ::GetDesktopWindow();HDC hdc = GetWindowDC(NULL);int x = GetDeviceCaps(hdc, HORZRES);int y = GetDeviceCaps(hdc, VERTRES);HBITMAP hbmp = ::CreateCompatibleBitmap(hdc, x, y), hold;HDC hmemdc = ::CreateCompatibleDC(hdc);hold = (HBITMAP)::SelectObject(hmemdc, hbmp);BitBlt(hmemdc, 0, 0, x, y, hdc, 0, 0, SRCCOPY);SelectObject(hmemdc, hold);Bitmap bit(xs, ys), bit2(hbmp, NULL);Graphics g(&bit);g.ScaleTransform((float)xs/x, (float)ys/y);g.DrawImage(&bit2, 0, 0);CLSID encoderClsid;EncoderParameters encoderParameters;encoderParameters.Count = 1;encoderParameters.Parameter[0].Guid = EncoderQuality;encoderParameters.Parameter[0].Type = EncoderParameterValueTy peLong;encoderParameters.Parameter[0].NumberOfValues = 1;encoderParameters.Parameter[0].Value = &quality;GetEncoderClsid(L"image/jpeg", &encoderClsid);bit.Save(pszFileName, &encoderClsid, &encoderParameters);::DeleteObject(hbmp);::DeleteObject(hmemdc);return;}HBITMAP ReturnHBITMAP(CString FileName)//FileName可能是bmp、dib、png、gif、jpeg/jpg、tiff、emf等文件的文件名{Bitmap tempBmp(FileName.AllocSysString()) ;Color backColor;HBITMAP HBitmap;tempBmp.GetHBITMAP(backColor,&HBitmap);return HBitmap;}。

用c语言读取并显示bmp图像

用c语言读取并显示bmp图像

用c语言读取并显示bmp图像如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?下面的是<>随书光盘上的代码,我在TC2.0下编译通过.它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.不过,我想问下,你老师教过抖动显示吗?#include#include#include#include#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,1 16},{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,1 18},{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,1 26},{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<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<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模式下使用。

C语言实现BMP图像显示软件课程设计

C语言实现BMP图像显示软件课程设计

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图像读取时是从左下角开始的。

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

VC中保存BMP位图文件的方法及BMP文件格式带源码实现

#include "stdio.h"#include "Windows.h"//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特) //此处定义全局变量主要为了后面的图像数据访问及图像存储作准备unsigned char *pBmpBuf;//读入图像数据的指针int bmpWidth;//图像的宽int bmpHeight;//图像的高RGBQUAD *pColorT able;//颜色表指针int biBitCount;//图像类型bool readBmp(char *bmpName){//二进制读方式打开指定的图像文件FILE *fp=fopen(bmpName,"rb");if(fp==0) return 0;//跳过位图文件头结构BITMAPFILEHEADERfseek(fp, sizeof(BITMAPFILEHEADER),0);//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中BITMAPINFOHEADER head;fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);//获取图像宽、高、每像素所占位数等信息bmpWidth = head.biWidth;bmpHeight = head.biHeight;biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256if(biBitCount==8){//申请颜色表所需要的空间,读颜色表进内存pColorTable=new RGBQUAD[256];fread(pColorTable,sizeof(RGBQUAD),256,fp);}//申请位图数据所需要的空间,读位图数据进内存pBmpBuf=new unsigned char[lineByte * bmpHeight];fread(pBmpBuf,1,lineByte * bmpHeight,fp);//关闭文件fclose(fp);return 1;}bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height, 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) + colorT ablesize + lineByte*height;fileHead.bfReserved1 = 0;fileHead.bfReserved2 = 0;//bfOffBits是图像文件前三个部分所需空间之和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);//如果灰度图像,有颜色表,写入文件if(biBitCount==8)fwrite(pColorTable, sizeof(RGBQUAD),256, fp);//写位图数据进文件fwrite(imgBuf, height*lineByte, 1, fp);//关闭文件fclose(fp);return 1;}//调色板与灰度图像的关系void main(){//读入指定BMP文件进内存char readPath[]="tarret.BMP";readBmp(readPath);//输出图像的信息printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBit Count);//改变灰度图像的颜色表蓝色分量的值,察看前后变化if(biBitCount==8){for(int i=0; i<256;i++){pColorTable[i].rgbBlue = 255-pColorTable[i].rgbBlue;}}//将图像数据存盘char writePath[]="tarret1.BMP";saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorT able);//清除缓冲区,pBmpBuf和pColorT able是全局变量,在文件读入时申请的空间delete []pBmpBuf;if(biBitCount==8)delete []pColorTable;}。

VC界面显示图片(BMP)

VC界面显示图片(BMP)

VC界面显示图片(BMP)1、通过点击浏览按钮选择BMP图像文件点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。

关键代码如下:char szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"; CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,szFilter );if(dlg.DoModal() == IDOK){CString strPathName = dlg.GetPathName();}2、加载BMP文件到内存通过得到的BMP图像文件路径目录,加载BMP图像文件到内存中。

关键代码如下:BOOL CShowBMPDlg::LoadShowBMPFile(const char *pPathname){CFile file;if( !file.Open( pPathname, CFile::modeRead) )return FALSE;DWORD m_nFileLen;m_nFileLen = file.GetLength();m_pBMPBuffer = new char[m_nFileLen + 1];if(!m_pBMPBuffer)return FALSE;if(file.ReadHuge(m_pBMPBuffer,m_nFileLen) != m_nFileLen)return FALSE;return TRUE;}3、将内存中的BMP文件内容转换到HBITMAP将内存中的BMP文件内容转换成位图句柄。

关键代码如下:HBITMAP CShowBMPDlg::BufferToHBITMAP(){HBITMAP hShowBMP;LPSTR hDIB,lpBuffer = m_pBMPBuffer;LPVOID lpDIBBits;BITMAPFILEHEADER bmfHeader;DWORD bmfHeaderLen;bmfHeaderLen = sizeof(bmfHeader);strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;hDIB = lpBuffer + bmfHeaderLen;BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits; CClientDC dc(this);hShowBMP =CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB _COLORS);return hShowBMP;}4、在屏幕上显示BMP图像双缓冲实现BMP位图显示在屏幕上。

用VC实现bmp位图打开和显示

用VC实现bmp位图打开和显示

用VC++实现bmp位图打开和显示课程名称:数字图象处理实验名称:用C++实现bimp图片的打开与显示班级:姓名:一试验目地:(1)、学会了解C++是使用;(2)、学会用C++解决图像处理问题二、实验内容:用C++语言编写bimp图像显示;三、实验步骤:1、首先建立一个工程。

打开VC++6.0,单击文件【files】→新建【new】→工程【projects】在打开的projects 下选择MFC App Wizard [exe]→在project name 下输入自己的工程名例如(Showpicture)→单击【ok】→在打开的对话框中选择基于单文档【single document】→在第四步“MFC App Wizard step 4 of 6”面板中删掉【隐藏工具栏】和【打印和打印预览】两个选项,之后的全部选择默认,单击finish,出现一个“New Project Information”窗口,单击【ok】。

一个简单的工程框架就建好了。

这是基于MFC App Wizard 自动生成的应用程序,如果我们自己还没有编译任何代码,现在就按下F7键编译程序,接着按Ctr+F5键运行程序,可以看到出现一个完整的带有标题栏、菜单栏的可调边框的应用程序。

2、现在我们正式开始在新建工程Showpicture中进行编程实现bmp位图的打开和显示。

点击左边框中的【ResourceView】框找到【Menu】点开,双击Menu下的图标,在右面的显示框中创建两个菜单:打开,显示原图。

分别双击这两个菜单修改属性:打开ID: ID_FILE_OPEN显示原图ID: IDM_YUANTU3、给这两个菜单建立类向导。

在右边的窗口中右击“打开”,选择“建立类向导”,然后在打开的对话框中按下图1操作,“Class name”选择“CShowpictureDoc” →”Object IDs”中选择“ID_FILE_OPEN” →“Message”中选择“COMMAND”,点击“Add Function”键就会在“Member functions”中如下显示:然后点击“Edit Code”,在自动生成的OnFileOpen函数中编写代码:void CShowpictureDoc::OnFileOpen(){// TODO: Add your command handler code hereCFileDialog fileDlg(TRUE);fileDlg.m_ofn.lpstrTitle="图片打开对话框";fileDlg.m_ofn.lpstrFilter="BMP Files(*.bmp)\0*.bmp\0\0";if(IDOK==fileDlg.DoModal ())filename.Format ("%s",fileDlg.GetPathName());CDib.LoadFile(filename);}同理,操作“显示原图”,如下图2显示:注意这次的“Class name”选择“CShowpictureView”。

将CBitmap类保存为bmp文件(VC++)

将CBitmap类保存为bmp文件(VC++)

做了一个截屏程序,提供了两种功能:将图象保存为文件,保存到剪切板。

后面一种相对简单代码量少,将图像保存为文件相对复杂,网上也有很多这样的函数(但是基本上都来自一个版本),COPY了一个过来,不能运行,但我相信程序的大部分功能是好的,以前也没有接触过类似的东西,所以一步步把它看懂,然后修改正确,也对代码结构作了调整。

相信能被更好的理解。

要保存为BMP文件,首先肯定要了解BMP文件的格式。

网上查资料知BMP文件的结构可以分为三个部分:1,文件的头结构,记录了整个文件的大小,图象类型,MFC类型为BITMAPFILEHEADER 2。

图象信息的头结构,记当了图象的一些信息,如大小,颜色深度等。

类型为:BITMAPINFOHEADER3. 图象各个象素的颜色值,这部分应该是文件的主体了。

有了以上的信息要保存BMP文件的步骤就很明显了。

创建这两个结构,并初始化,边同象素颜色值写入文件即可,我下面的代码遵循的就是这个步骤,所以感觉条理应该比较清楚。

直接上代码(以下代码在VC 6。

0中通过测试)void MySaveBmpT ofile(HBITMAP hbmp, CString path){//参数说明: hbmp :需保存的图象的句柄path :保存路径//定义文件头结构BITMAPFILEHEADER fileHead;int fileHeadLen = sizeof( BITMAPFILEHEADER );//定义图象信息结构BITMAPINFOHEADER bmpHead;int bmpHeadLen =sizeof( BITMAPINFOHEADER );BITMAP bmpObj;GetObject( hbmp, sizeof(BITMAP), &bmpObj );DWORD fileSizeInByte; //文件总的字节大小//获取系统颜色深度,即每个象素用多少位表还示DWORD PixelSizeInBit;CDC srcDC; //系统屏幕设备描述表srcDC.CreateDC( "DISPLAY", NULL, NULL, NULL);PixelSizeInBit=srcDC.GetDeviceCaps( BITSPIXEL ) * srcDC.GetDeviceCaps( PLANES ); fileSizeInByte = fileHeadLen + bmpHeadLen +bmpObj.bmWidth*bmpObj.bmHeight*PixelSizeInBit/8;//初始化文件头结构fileHead.bfOffBits = fileHeadLen + bmpHeadLen;fileHead.bfReserved1=0;fileHead.bfReserved2=0;fileHead.bfSize = fileSizeInByte;fileHead.bfType = 0x4D42;///初始图像信息结构bmpHead.biBitCount = PixelSizeInBit;bmpHead.biCompression = BI_RGB;bmpHead.biPlanes = 1;bmpHead.biHeight = bmpObj.bmHeight;bmpHead.biWidth = bmpObj.bmWidth;bmpHead.biSize = bmpHeadLen;//为文件分配空间PBYTE pFile=new byte[ fileSizeInByte ];memset( pFile, 0, fileSizeInByte );//填充文件头部memcpy( pFile, (PBYTE)&fileHead, fileHeadLen);//填充文件信息头部结构memcpy( pFile+fileHeadLen, (PBYTE)&bmpHead, bmpHeadLen);//填充象素部分GetDIBits( srcDC.m_hDC, hbmp, 0, bmpObj.bmHeight, pFile+fileHeadLen+bmpHeadLen, (LPBITMAPINFO)(pFile+fileHeadLen), DIB_RGB_COLORS);//打开文件并写入数据HANDLE hFile;hFile=CreateFile( path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if( hFile==INVALID_HANDLE_VALUE ){MessageBox( "创建文件失败" );return;}DWORD nByteTransfered;WriteFile( hFile, pFile, fileSizeInByte, &nByteTransfered, NULL);CloseHandle( hFile );//清理delete pFile;srcDC.DeleteDC();}保存成功以后,可以用16进制编辑器,打开BMP文件,可以按照在pFile中写入的顺序对里面的文件进行解析,第一个双字节正是写入的0x4D42,哈哈。

在vc中自建操作bmp位图文件的类(Classes that build BMP bitmap files in VC)

在vc中自建操作bmp位图文件的类(Classes that build BMP bitmap files in VC)

在vc中自建操作bmp位图文件的类(Classes that build BMP bitmapfiles in VC)Classes that build BMP bitmap files in VCXi'an Wanshan Software Co. Ltd.JiatunProgrammers who have programming experience know that to make the application's interface beautiful and inevitableUsing lots of bitmaps. The popular visual programming tools now provide good use of bitmapsThe support, known as the three visual development tools of VB, VC, and Delphi, encapsulates bitmaps by encapsulating themObjects provide good support for bitmap usage: VB provides two powerful objects:PictureBox and Image make it very easy to load and display bitmaps by using them.Delphi also provides a bitmap object: TImage, its function and usage, and VBImage is similar. In VC, you use the device dependent class CDC and the GDI object class CBitmap to completeBitmap operation. However, in VC, using the CBitmap class mustload the BMP bitmap into the resource,Then, using the member functions of class CBitmap, use it to operate through member functions of the CDC classIt. There are two drawbacks to doing this: loading a bitmap into a resource causes an executable file to increase and is detrimentalIn software release; can only use limited bitmap in the resource, unable to select other bitmap. AndThe BMP bitmap file is saved in DIB (device independent bitmap), and the BMP bitmap is loaded into the resourceIs converted to DDB (device related bitmaps), and class CBitmap is a series of DDB operationsThe API function is encapsulated and used with some limitations, so that DIB can be independentPlatform characteristics. To make up for two deficiencies in using a resource bitmap, you must use the BMP bitmap directlyDocument. The example of VC provides a way to read and display BMP bitmap files, but use themQuite troublesome. First, use the API function GlobalAlloc to allocate memory and create the HDIB bitmapHandle, all operations can only read and write memory directly,and then through StrechDIBits andThe SetDIBsToDevice function appears on the screen, and it takes time and effort to operate.Therefore, the author studies the encapsulation and DIB structure of class CBitmap and uses the new functions provided in Win32Number, set up a class dedicated to operating BMP files, and completely follow the implementation of class CBitmap:Derived from class CGdiObject, all interfaces of the new class are exactly the same as part of the class CBitmap interface.Thus, the interface between the two is used for programmers who are accustomed to using the CBitmap class interfaceThere is no difference.Let's start with a brief introduction to the structure of DIB. DIB bitmaps can exist either in memory or in memorySave in file form on disk (BMP file). All DIB contains two parts of information: bitmapsInformation (BITMAPINFO), including bitmaps, headers, and color tables; bitmap data. For memoryAs long as the above two parts of DIB, and for the DIB file, you also have to add bitmap file header. TwoThe structure is shown here:DIBDIB fileSecond, Win32 provides a new function, CreateDIBSection, which creates a new oneMemory locations that store DIB bits can either execute the corresponding GDI operations or point directly through themThe pointer, azimuth, DIB bit region of the DIB bit region. This is a very useful function, through which weYou can use DIB instead of DDB.After knowing the relevant knowledge, we can derive an operation BMP by ourselves from class CGdiObjectClass: CBitmapFile.There are two points worth noting when writing your own class:1. to define class CBitmapFile in the BitmapFile.h file, you must first declare the class CBitmapFileIs derived from class CGdiObject. Then use macros first in the classDECLARE_DYNAMIC (CBitmapFile) indicates that the highest parent class of the new class is class CObject, which is consistentClass library specification for MFC. Next to macro DECLARE_DYNAMIC is the declaration of the static function FromHandle,These two declarations must be placed at the forefront of the class definition.2. add the function of the class member in the BitmapFile.cpp file before you implement itIMPLEMENT_DYNAMIC (CBitmapFile, CGdiObject); indicates that class CBitmapFile is derived directlyClass CGdiObject.In a class CBitmapFile declaration, three functions are slightly different from the definitions in class Cbitmap:1. in class CbitmapFile, the argument of the LoadBitmap function is LPCTSTR, and the BMP text is savedFilename of the file.2. in class CbitmapFile, the parameter in the CreateBitmap function is less parameter nPlanes, in functionThe internal default is 1.3. in class CbitmapFile, there is more parameter lpBits in the arguments of the CreateBitmapIndirect function,It points to the memory area of the specified bitmap DIB bits.The most important thing in the member function is the function CreateBitmapIndirect and the function LoadBitmap:1. creates a function with function CreateBitmapIndirect in the function CreateDIBSectionCompatible with the DC based HBITMAP handle and Attach it with the function CGdiObject that inherits from class A.The handle CGdiObject of class m_hObject is associated. The DIB bitmap data of the specified bitmap is then copiedThe memory area of the DIB bit created by the function CreateDIBSection.2. in function LoadBitmap, the structure is first read from the file of the specified file nameBITMAPFILEHEADER is the size of the data block, and then the file header mark to determine whether the file is BMP bitsThe file size of the chart file, then saved by BITMAPFILEHEADER in bfSize, is really large with the fileSmall comparison file for damage, and then by BITMAPFILEHEADER,bfOffBits andBITMAPFILEHEADER structure size subtraction, calculate the location, information head and color table of the total size, moveApply a space to save bitmaps, information headers, and color table information, and then from BITMAPFILEHEADERBfSize and bfOffBits subtract, calculate the size of DIB bitmap data, dynamically apply for a space to saveDIB bitmap data, and finally call the member function CreateBitmapIndirect to create the DIB bitmap.In the OnPaint () event of the application, the method of drawing the DIB bitmap is drawn when using class CBitmapBitmap methods are exactly the same, but one thing to note is that the CDC class does not provide the return of the new classThe CBitmapFile pointer type selects the DIB bitmap into the memory's SelectObject function, so in makingWhen SelectObject is used, the return type is coerced to CbitmapFile * type.So far, some of the main points in the preparation of the new class CBitmapFile and some of the issues you should pay attention to when using itIntroducing so much.Attached file/ /File Description: / / class CBitmapFile, the class is used to read the BMP file, to read,/ / establishment and a series of common operation./ / file name: BitmapFile.h/ / time: 1999-2-11/ / Author: Jia Tun/ /#ifndef _CBITMAPFILE_H_#define _CBITMAPFILE_H_Class CBitmapFile: public CGdiObject{DECLARE_DYNAMIC (CBitmapFile)Public:Static, CBitmapFile*, PASCAL, FromHandle (HBITMAP, hBitmap);/ / ConstructorsCBitmapFile ();BOOL LoadBitmap (LPCTSTR lpszFileName);BOOL, CreateBitmap (int, nWidth, int, nHeight, UINT, nBitCount, const, void*, lpBits);BOOL CreateBitmapIndirect (LPBITMAPINFO, lpBitmapInfo, const, void*, lpBits);/ / AttributesOperator HBITMAP () const;Int GetBitmap (BITMAP* pBitMap);Protected:/ / AttributesInt GetColorNumber (WORD wBitCount);Public:/ / OperationsDWORD SetBitmapBits (DWORD, dwCount, const, void*, lpBits);DWORD GetBitmapBits (DWORD, dwCount, LPVOID, lpBits);/ / ImplementationPublic:Virtual, ~CBitmapFile ();};#endif/ /File Description: / / implementation class member function in CBitmapFile/ / file name: BitmapFile.cpp/ / time: 1999-2-11/ / Author: Jia Tun/ /#include "BitmapFile.h""#include <memory.h>IMPLEMENT_DYNAMIC (CBitmapFile, CGdiObject);CBitmapFile* PASCAL CBitmapFile:: FromHandle (HBITMAP hBitmap){Return (CBitmapFile*) CGdiObject:: FromHandle (hBitmap);}CBitmapFile:: CBitmapFile (){}BOOL CBitmapFile:: LoadBitmap (LPCTSTR, lpszFileName){CFile file;If (... File.Open (lpszFileName, CFile:: modeRead|CFile:: shareDenyWrite)){MessageBox (NULL, BMP, file, open, error), warning, MB_OK);Return FALSE;BITMAPFILEHEADER bfhHeader;File.Read (&bfhHeader, sizeof (BITMAPFILEHEADER));If (bfhHeader.bfType = = ((WORD) ('M'<<8) |'B')){MessageBox(null,“该文件不是一个BMP文件!”,“警告”,mb_ok);返回false;}如果(bfhheader.bfsize!=文件getlength())。

C语言实现BMP图片生成

C语言实现BMP图片生成

C语⾔实现BMP图⽚⽣成###include <stdio.h>#include <stdlib.h>#include <string.h>typedef unsigned char byte;typedef unsigned short dbyte;typedef unsigned long int dword;typedef unsigned short word;/********************************************定义bmp⽂件的头部数据结构********************************************/#pragma pack(push,2) //保持2字节对齐struct tagBITMAPFILEHEADER {//bmp file headerdbyte bfType; //⽂件类型dword bfSize; //⽂件⼤⼩,字节为单位word bfReserved1; //保留,必须为0word bfReserved2; //保留,必须为0dword bfOffBits; //从⽂件头开始的偏移量//bmp info headdword biSize; //该结构的⼤⼩dword biWidth; //图像的宽度,以像素为单位dword biHeight; //图像的⾼度,以像素为单位word biPlanes; //为⽬标设备说明位⾯数,其值总是设为1word biBitCount; //说明⽐特数/像素dword biCompression; //图像数据压缩类型dword biSizeImage; //图像⼤⼩,以字节为单位dword biXPelsPerMeter; //⽔平分辨率,像素/⽶dword biYPelsPerMeter; //垂直分辨率,同上dword biClrUsed; //位图实际使⽤的彩⾊表中的颜⾊索引数dword biClrImportant; //对图像显⽰有重要影响的颜⾊索引的数⽬//bmp rgb quad//对于16位,24位,32位的位图不需要⾊彩表//unsigned char rgbBlue; //指定蓝⾊强度//unsigned char rgbGreen; //指定绿⾊强度//unsigned char rgbRed; //指定红⾊强度//unsigned char rgbReserved; //保留,设置为0}BMPFILEHEADER;#pragma (pop)struct tagBITMAPFILEHEADER *bmp_p; //定义bmp⽂件头结构体指针FILE *fd; //定义⼀个⽂件类型的指针/**************************************************************初始化bmp⽂件头部,设置bmp图⽚**************************************************************/void Init_bmp_head(void){bmp_p = &BMPFILEHEADER;bmp_p-> bfType = 0x4D42; //⽂件类型bmp_p-> bfSize = 0x25836; //⽂件⼤⼩,字节为单位bmp_p-> bfReserved1 = 0x0; //保留,必须为0bmp_p-> bfReserved2 = 0x0; //保留,必须为0bmp_p-> bfOffBits = 0x36; //从⽂件头开始的偏移量//bmp info headbmp_p-> biSize = 0x28; //该结构的⼤⼩bmp_p-> biWidth = 320; //图像的宽度,以像素为单位bmp_p-> biHeight = 240; //图像的⾼度,以像素为单位bmp_p-> biPlanes = 0x01; //为⽬标设备说明位⾯数,其值总是设为1bmp_p-> biBitCount = 16; //说明⽐特数/像素bmp_p-> biCompression = 0; //图像数据压缩类型bmp_p-> biSizeImage = 0x25800;//0x09f8; //图像⼤⼩,以字节为单位bmp_p-> biXPelsPerMeter = 0x60;//0x60; //⽔平分辨率,像素/⽶bmp_p-> biYPelsPerMeter = 0x60; //垂直分辨率,同上bmp_p-> biClrUsed = 0; //位图实际使⽤的彩⾊表中的颜⾊索引数bmp_p-> biClrImportant = 0; //对图像显⽰有重要影响的颜⾊索引的数⽬}int main(void){static char *file_name =NULL; //保存⽂件名的指针static long file_length = 0x25836; //⽂件的⼤⼩(整个⽂件)unsigned char *file_p = NULL; //写⼊数据指针unsigned char *file_p_tmp = NULL; //写⼊数据临时指针unsigned char *byte_copy_p = NULL; //⽂件头部传递指针unsigned char byte_copy = 0; //⽂件头部数据拷贝变量int i = 0;file_name = "test1.bmp";Init_bmp_head();file_p = (unsigned char *)malloc(sizeof(char)*153654); //申请⼀段内存 file_p_tmp = file_p;for(i = 0;i < 153654;i++ ){if(i%2 ==0){*file_p_tmp = 0x00; //图像前8位值}else{*file_p_tmp = 0xf0; //图像后8位值}file_p_tmp++;}byte_copy_p = (unsigned char *)bmp_p;file_p_tmp = file_p;for(i = 0;i < 54;i++){*file_p_tmp = *byte_copy_p;file_p_tmp++;byte_copy_p++;}fd = fopen(file_name, "w");fwrite(file_p, file_length, 1,fd);free(file_p); //释放申请的内存(重要)fclose(fd);printf("Done success\n");getchar();return (0);}。

用C语言写BMP图像文件

用C语言写BMP图像文件

用C语言写BMP图像文件用C语言写BMP图像文件网上很多关于如何加载bmp图像文件的程序,关于如何生成bmp文件确比较少,来补充这个空白吧输出bmp图像,首先要了解bmp的文件结构,这个谷歌一下有很多资料,简单说由三部分构成1.文件头tagBITMAPFILEHEADER2.信息头tagBITMAPINFOHEADER3.颜色表tagRGBQUAD (可以省略这个结构)由于一会不使用这个结构,先简单介绍下,以上两个结构体在程序中详细介绍如下:typedef struct tagRGBQUAD {BYTErgbBlue; // 蓝色的亮度(值范围为0-255)BYTErgbGreen; // 绿色的亮度(值范围为0-255)BYTErgbRed; // 红色的亮度(值范围为0-255)BYTErgbReserved; // 保留,必须为0} RGBQUAD;颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1, 4, 8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。

(本程序生成的是24位真彩图,所以不需要定义颜色表项)位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下: typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader; // 位图信息头RGBQUAD bmiColors[1]; // 颜色表} BITMAPINFO;※※※※准备工作完了,下面进入正题bmpwin.c#include <stdio.h>#include <malloc.h>#include <stdlib.h>/*位图头文件数据结构*/typedef struct tagBITMAPFILEHEADER {unsigned char bfType[2]; //位图文件类型,必须为'B' 'M'unsigned long bfSize; //位图文件大小(以字节为单位)unsigned short bfReserved1; //位图文件保留字,必须为0unsigned short bfReserved2; //位图文件保留字,必须为0unsigned long bfOffBits; //位图数据的起始位置,以相对位图文件头的偏移量(单位字节)}BITMAPFILEHEADER ; //共14Byte/*位图信息数据结构*/typedef struct tagBITMAPINFOHEADER{unsigned long biSize; //本结构所占用字节数long biWidth; //位图宽度,以像素为单位long biHeight; //位图高度,以像素为单位unsigned short biPlanes; //目标设备级别,必须为1unsigned short biBitCount; //每个像素所需的位数,1(双色),4(16色),8(256色),24(真彩色)unsigned long biCompression; //位图的压缩类型,必须是0(示不压缩),1(BI_RLE8压缩类型),2(BI_RLE4压缩类型)之一unsigned long biSizeImage; //位图大小以字节为单位long biXPixPerMeter; //图像水平分辨率,每米像素数long biYPixPerMeter; //图像垂直分辨率,每米像素数unsigned long biClrUsed; //位图实际使用的颜色表中的颜色数unsigned long biClrImporant; //位图显示过程中重要的颜色数}BITMAPINFOHEADER; //共40Byteint main(void){FILE *fp;int i,j;unsigned char c, d;BITMAPFILEHEADER *bitmapFileHeader;BITMAPINFOHEADER *bitmapInfoHeader;if((fp=fopen("f://234.bmp", "wb")) = =NULL){fprintf(stderr, "file cannot open\n");exit(1);}/* 结构体指针初始化 */bitmapFileHeader=(BITMAPFILEHEADER*)malloc(sizeof(BITMAPFILEHEADER));bitmapInfoHeader=(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));printf("%d\n",sizeof( bitmapFileHeader->bfType[2]));/*定义位图头文件数据结构*/bitmapFileHeader->bfType[0] = 'B';bitmapFileHeader->bfType[1] = 'M';bitmapFileHeader->bfReserved1 = 0x0000;bitmapFileHeader->bfReserved2 = 0x0000;//位图起始位置bitmapFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);/*定义位图信息数据结构*/bitmapInfoHeader->biSize = sizeof(BITMAPINFOHEADER);bitmapInfoHeader->biWidth = (long)128;bitmapInfoHeader->biHeight = (long)128;bitmapInfoHeader->biPlanes = 0x0001;bitmapInfoHeader->biBitCount = 0x0018; //24位图bitmapInfoHeader->biCompression = 0x0000; //不压缩/*每像素由RGB24位构成,即3字节*/bitmapInfoHeader->biSizeImage = bitmapInfoHeader->biWidth*bitmapInfoHeader->biHeight * 3;bitmapInfoHeader->biXPixPerMeter = 3780; /*96dpi*/bitmapInfoHeader->biYPixPerMeter = 3780; /*96dpi*/bitmapInfoHeader->biClrUsed = 0;bitmapInfoHeader->biClrImporant = 0;/*位图文件大小*/bitmapFileHeader->bfSize = bitmapFileHeader->bfOffBits + bitmapInfoHeader->biSizeImage;/*位图头文件结构写入文件*/fwrite((unsigned char *)bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, fp);/*位图信息结构写入文件*/fwrite((unsigned char *)bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, fp);/*RGB颜色写入文件*/for(j=0;j<bitmapInfoHeader->biHeight;j++){for(i=0;i<bitmapInfoHeader->biWidth;i++){c=(((i&0x08)==0)^((j&0x08)==0))*255;fputc(c, fp); /* B */fputc(c, fp); /* G */fputc(c, fp); /* R */}}free(bitmapFileHeader);free(bitmapInfoHeader);fclose(fp);return 0;}本程序在VS2010下编译通过,生成图像如图如果编译成功,但是生成图像打不开,很有可能是在图片的结构信息写入文件时候出现错误,fwrite()函数在将结构体写入文件的时候,如果数据总大小sizeof(BITMAPINFOHEADER) 大于结构体中成员变量大小的和的话(即结构体内存对齐现象),可能会写入错误。

VC环境下读取显示.bmp图像方法

VC环境下读取显示.bmp图像方法

总结显示bmp图像的方法,列出四种显示方法。

1 通过SetPixel()函数画出每个像素点来显示图像。

2 通过读取位图资源中bmp资源显示图像。

3 通过读取本地文件,利用位图结构信息,定义HGLOBAL,再采用固定的显示方式显示位图。

4 通过读取本地文件,利用位图结构信息,定义buffer,再采用SetDIBitsToDevice()函数。

下面分别对这四种方法进行详细描述:首先新建VC工程ShowBmpImage->MFC->单文档模式。

将显示的操作都是放在CShowBmpImageView下进行的,并且没有定义成员变量。

1 第一种方法通过SetPixelShow()函数循环画出每个像素点,从而显示图像。

操作如下:增加成员函数SetPixelShow(),编辑代码如下:int x,y; //定义像素位置CClientDC dc(this); //获取dc,也可以用CDC *pDCfor(x=0;x<200;x++)for(y=0;y<200;y++)dc.SetPixel(x,y,RGB(x,y,255)); //画一个像素点,RGB是颜色调用函数后,显示的是一幅彩色图像,可以根据需要改变RGB的值来显示一幅完整的图像。

2 第二种方法通过读取位图资源中的位图显示图像,选择菜单栏->插入->资源,弹出对话框,选择导入按钮,将文件类型改成所有文件,选择想要显示bmp位图,导入。

这样工程的资源位图中,导入的位图默认的ID是IDB_BITMAP1。

而显示这种位图有一个固定的显示模式,非常方便。

方法如下:a 定义一个CBitmap对象,使其加载位图资源。

b 定义一个CDC对象,用于装载位图;使其创建兼容DC,相当于初始化;与CBitmap对象关联起来,相当于获取位图。

c 定义BITMAP对象,使其与CBitmap对象绑定,可以获取宽度和高度。

d 创建DC,画图像。

e 选择回原来的资源。

在VC中自建操作BMP位图文件的类

在VC中自建操作BMP位图文件的类

在VC中自建操作BMP位图文件的类有编程经验的程序员都知道:要使应用程序的界面美观不可避免的要使用大量位图。

现在流行的可视化编程工具对位图的使用提供了很好的支持,被称为三大可视化开发工具的VB、VC、Delphi通过封装位图对象对位图使用提供了很好的支持:VB提供了两个功能很强的对象:PictureBox及Image,通过使用它们,装载、显示位图变得非常容易。

Delphi中也提供了一个位图对象:TImage,它的功能与用法与VB中的Image类似。

在VC中通过使用设备相关类CDC与GDI对象类CBitmap来完成位图的操作。

然而在VC中使用CBitmap类必须将BMP位图装入资源中,然后通过类 CBitmap 的成员函数使用它,在通过CDC类的成员函数操作它。

这样做有两点缺陷:将位图装入资源导致可执行文件增大,不利于软件发行;只能使用资源中有限的位图,无法选取其它位图。

而且BMP位图文件是以DIB(设备无关位图)方式保存,BMP位图装入资源后被转换为DDB(设备相关位图),类CBitmap就是对一系列DDB操作的API函数进行了封装,使用起来有一定的局限性,不如DIB可以独立于平台特性。

要弥补使用资源位图的两点不足,就必须直接使用BMP位图文件。

VC的示例中提供了一种方法读取并显示BMP位图文件,但使用起来相当的麻烦。

首先使用API 函数GlobalAlloc分配内存并创建HDIB位图句柄,所有操作只能直接读写内存,然后通过StrechDIBits及SetDIBsToDevice函数来显示于屏幕上,操作起来费时费力。

因此笔者通过研究类CBitmap的封装与DIB结构,使用Win32中提供的新函数,建立了一个专用于操作BMP文件的类,而且完全仿照类CBitmap的实现:从类CGdiObject派生,新类的所有接口与类CBitmap 的部分接口完全相同。

这样对于习惯使用CBitmap类接口用法的程序员来说两者的接口在使用上没有什么分别。

C语言中如何生成BMP格式图形文件

C语言中如何生成BMP格式图形文件

C语言中如何生成BMP格式图形文件
李鹤升
【期刊名称】《江汉石油科技》
【年(卷),期】1997(007)003
【摘要】在科技论文和技术报告中,经常需要插入尽可能精确的各种黑白或彩色的图形和曲线,周而一般的绘图工具难以满足,尤其是通过复杂计算得到的结果更是如此。

介绍了在科研人员广泛使用的C语言中,如何把黑白的或彩色的图文转换成BMP图形格式文件,从而顺利地插入用Word软件写的中文或英文报告中。

介绍了BMP文件的结构,并给出了C语言程序函数,读者易于使用。

【总页数】5页(P28-32)
【作者】李鹤升
【作者单位】江汉石油管理局测井研究所
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.BMP格式在个性化字库自动生成中的应用 [J], 成耀;王晓瑜;顾翔;鲁松
2.用C语言生成SPT图形文件 [J], 时献江
3.BASIC语言在处理SPT图形文件中的应用 [J], 王二才;周文峰
4.BMP格式在个性化字库自动生成中的应用 [J], 成耀;王晓瑜;顾翔;鲁松;
5.用C语言编程生成Auto CAD的外部图形文件 [J], 黄玉田;高兰
因版权原因,仅展示原文概要,查看原文内容请购买。

利用VISUAL BASIC将整屏画面保存于BMP文件中

利用VISUAL BASIC将整屏画面保存于BMP文件中

利用VISUAL BASIC将整屏画面保存于BMP文件中
张海忠
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1996(000)007
【摘要】对应用程序运行过程中,出现的动态或静止的整屏画面,用快键保存于位图文件BMP之中,可使其它应用程序使用。

【总页数】2页(P35-36)
【作者】张海忠
【作者单位】无
【正文语种】中文
【中图分类】TP317
【相关文献】
1.利用Visual Basic语言在独立坐标系中绘图 [J], 朱彦名
2.Visual Basic中利用ADO技术访问数据库分析 [J], 张建莉
3.在Visual Basic中利用通信控件实现串行通信技术 [J], 管玉芬;彭汉荣;陈晓丹
4.在Visual Basic中利用CPU序列号制作注册码 [J], 陈燊
5.在Visual Basic中利用Spreadsheet组件绘制福彩3D走势图 [J], 朴艳丽;张楠因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
oldPen = NULL;
}
//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{
CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.bmp)|*.bmp|",NULL);
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
*((char *)&bmfh.bfType) = ''B'';
*(((char *)&bmfh.bfType) + 1) = ''M'';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
pMemDC->SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
2007-06-10 08:16:51
VC++编程技术连载---VC++实现将自绘图形输出为bmp文件
一、实现方法
要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都ok呢。先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选择到当前设备环境,然后在当前设备环境输出文本和图形就可以了。
double dbX1 = (xMax- xMin)/100 + xMin;
double dbY1 = 600/dbX1 ;
for (int i=1; i<100; i++) //曲线
{
double dbX2 = (xMax- xMin)*i/100 + xMin;
double dbY2 = 600/dbX2 ;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
二、具体实现代码如下
void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)));
dbX1=dbX2;
dbY1=dbY2;
}
pDC->SelectObject(oldPen);
pen.DeleteObject();
pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)));
pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
//输出文本和图形
void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);
CView::OnRButtonDown(nFlags, point);
}
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,255));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *oldPen = pDC->SelectObject(&pen);
double xMin = 10.00f, xMax = 100.00f;
double yMin = 10.00f, yMax = 200.00f;
相关文档
最新文档