2.MFC-bmp图片读取保存

合集下载

MFC中显示.bmp格式的位图

MFC中显示.bmp格式的位图

MFC中显⽰.bmp格式的位图最近在看VisualC++ 图像处理的书籍,表⽰⼀直在从基础做起,今天就记录⼀个简单功能的实现,显⽰.bmp格式的位图。

⾸先需要理解的是窗⼝创建的过程包括两个步骤:⾸先擦除窗⼝的背景,然后在对窗⼝进⾏重新绘制。

⼀般⽽⾔,对于单⽂档或多⽂档的MFC程序,显⽰图像的代码要放在OnDraw函数之中。

刚刚说过,窗⼝重绘时,要先将窗⼝的背景擦除,也就是发送WM_ERASEBKGND消息,然后⽤OnEraseBkgnd()函数处理这个消息,所以我们的显⽰图像的代码也可以放在这个函数之中。

当然,这⾥只是为了实现显⽰位图这⼀个功能,在实际⼯程中,要根据实际情况,选择代码放置的地⽅。

下⾯先给出代码,然后⼀⾏⼀⾏地详细解释:BOOL CLoadBitmapView::OnEraseBkgnd(CDC* pDC){// TODO: 在此添加消息处理程序代码和/或调⽤默认值//return FALSE;HBITMAP hBit;hBit=(HBITMAP) LoadImage(NULL,_T("D:\\Axing.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); //载⼊图像CBitmap cBit;cBit.Attach(hBit);CDC MemDC;MemDC.CreateCompatibleDC(pDC); //创建与当前设备描述表相适应的内存DCBITMAP bitmap;cBit.GetBitmap(&bitmap);CBitmap *oldBit;oldBit=MemDC.SelectObject(&cBit);CRect rect;GetClientRect(&rect);pDC->BitBlt(100,100,rect.Width()/2.5,rect.Height(),&MemDC,0,0,SRCCOPY);return TRUE;//return CView::OnEraseBkgnd(pDC);}⾸先来解释⼀下HBITMAP、CBitmap、BITMAP三者之间的关系。

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

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

VC环境下读取显示.bmp图像方法总结显示bmp图像的方法,列出四种显示方法。

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

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

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

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

下面分别对这四种方法进行详细描述:首先新建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对象绑定,可以获取宽度和高度。

MFC 读取并显示图片和彩色转灰度

MFC 读取并显示图片和彩色转灰度
VC 6.0
By侯海艳(UCAS)
关于MFC读取BMP图片,相信对于很多初学者都是一头雾水,找不着头绪。那么就让我浅浅地说一说到底怎么样读取并显示BMP图片吧。因为我也是初学,摸索学习了四五天,由于有些MFC基础,因此大概理清了MFC读取图片的机理。说的不对请提出宝贵建议,高手请绕道。
C++的学习难就难在指针上面,我们必须很好地了解数据的存储方式和指针的基本知识。一般来说,数据存储在内存中是以内存块的形式存储的,即给变量分配一定大小的空间,这个空间就像书架一样,里面装满了一本一本的书,每本书就对应着一个数据单元。我们定义一个指针,指向这个内存块,指针的位置就在内存块的开头,即数据的第一个元素。当我们要获取后面的元素的时候就要移动指针获取。下面会具体说。
1.从新建MFC文档开始
新建MFC文档的时候,可以选择多文档类型,一般选择默认,但有一点需要注意,当新建这只到了第六步的时候,C*View类的Base Class要选择CScrollView,而不是默认的CView。如下图:Teeee是我随便命名的工程名
(旋转了90度)
这样打开文档就可以看到上图中有许多文件,我们所要编辑的主要是Doc.cpp、View.cpp和Header Files里面的Doc.h头文件。
if ( rowBytes!=pDoc->m_Width*pDoc->m_PxlBytes )
{
pBuf = new BYTE[pDoc->m_Height*rowBytes];
for (int i=0;i<pDoc->m_Height;i++ )
memcpy( pBuf+i*rowBytes,pDoc->pImgData+i*pDoc->m_Width*pDoc->m_PxlBytes,pDoc->m_Width*pDoc->m_PxlBytes );

MFC开发位图BitMap图像的读取与存储

MFC开发位图BitMap图像的读取与存储

[cpp]view plaincopy01. #include "BitMap.h"02. #include03. #include04. #include05. usingnamespace std;06. #define NULL 007.08. BitMap::BitMap(){};09. BitMap::~BitMap(){};10.11. //read bitmap info from a file12. bool BitMap::Read(char* fileName)13. {14. FILE *_f=fopen(fileName,"rb");//open file15. if(_f==NULL) returnfalse;16.17. fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,_f);//read BITMAPFILEHEADER18.19. fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,_f);//read BITMAPINFOHEADER20. width_p=infoHeader.biWidth;21. height_p=infoHeader.biHeight;22. bitCount=infoHeader.biBitCount;23.24. if(bitCount==8)//if colorTable exist,read colorTable25. {26. colorTable=new RGBQUAD[256];27. fread(&colorTable,sizeof(RGBQUAD),256,_f);28. }29.30. dataBuf=new unsigned char[infoHeader.biSizeImage];//read image data31. fread(dataBuf,1,infoHeader.biSizeImage,_f);32.33. fclose(_f);//close file34. returntrue;35. }36.37. //write bitmap info to a file38. bool BitMap::Write(char * _fileName)39. {40. FILE* f=fopen(_fileName,"wb");//create or open file to be written41. if(f==NULL) returnfalse;42.43. int colorTableSize=0;//if bitcount is 24, there is no color table.44. if(bitCount==8)//if bitcount is 8 ,the size of color table is 256*4,4B is the size of RGBQUAD.45. colorTableSize=sizeof(RGBQUAD)*256;46.47. int headerSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ colorTableSize;//the size of the header of bmp file.48. int lineSize=(width_p*bitCount/8+3)/4*4;//the size of each line in bmp file.49. int dataSize=lineSize*height_p;//the size of the image data of bmp file.50.51. fileHeader.bfType=0x4D42;//set the attribute of BITMAPFILEHEADER52. fileHeader.bfSize=headerSize+dataSize;53. fileHeader.bfReserved1=0;54. fileHeader.bfReserved2=0;55. fileHeader.bfOffBits=headerSize;56.57. infoHeader.biSize=40;//set the attribute of BITMAPINFOHEADER58. infoHeader.biWidth=width_p;59. infoHeader.biHeight=height_p;60. infoHeader.biPlanes=1;61. infoHeader.biBitCount=bitCount;62. infoHeader.biCompression=0;63. infoHeader.biSizeImage=dataSize;64. infoHeader.biClrImportant=0;65. infoHeader.biXPelsPerMeter=0;66. infoHeader.biYPelsPerMeter=0;67.68. fwrite(&fileHeader,sizeof(BITMAPFILEHEADER),1,f);//write the data of BITFILEHEADER to bmp file69. fwrite(&infoHeader,sizeof(BITMAPINFOHEADER),1,f);//write the data of BITINFOHEADER to bmp file70. if(bitCount==8)//if color table exists,write the data of color table to bmp file71. {72. colorTable=new RGBQUAD[256];73. fwrite(&colorTable,sizeof(RGBQUAD),256,f);74. }75. fwrite(dataBuf,1,dataSize,f);//write the image data to bmp file76.77. fclose(f);//data writting is finished,close the bmp file.78. return true;79. }程序入口:[cpp]view plaincopy01. void main()02. {03. BitMap* bm=new BitMap();04. bm->Read("nv.BMP");05. bm->Write("nvnew.bmp");06. delete bm;07. }。

MFC窗口程序添加bmp图片

MFC窗口程序添加bmp图片

MFC窗口程序添加bmp图片2010-11-29 22:26最近重新开始学习MFC。

想往窗口里画张图,折腾了一个多小时。

(唉,欲善其事,先利其器.....我资料太少了)以后写点东西就往这里传了,一来方便以后自己参阅,另一方面希望帮到遇到同样问题的兄弟姐妹们。

参考资料 MFC windows 编程(第二版)Step 1 :新建一个空白窗口 VC 6.0 工程:Win32 Application添加头文件:lonewolf_mm.h 名字取个你喜欢的把下面的代码拷进去,没关系,编程一开始都是抄别人的 : )/****************************************************************************** * File Name : lonewolf_mm.h* Description :* Author : lonewolf******************************************************************************/class CMyApp :public CWinApp{public:virtual BOOL InitInstance();};class CMainWindow : public CFrameWnd{public:CMainWindow();protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()};///////////////////////////////////////////////// file end//////////////////////////////////////////////////////////////////////////按下来是源文件了,同样的新建一个cpp,把下面的代码拷进去。

MFC界面保存实现

MFC界面保存实现

/ghevinn/article/details/28269743将屏幕和MFC程序界面保存成bmp格式图片保存分类:c++专区MFC客户端2014-06-03 16:39 915人阅读评论(1) 收藏举报将屏幕保存为图片,使用vs2008编译通过。

#include "stdafx.h"#include <windows.h>#include <atlimage.h>int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){HWND hwnd = ::GetDesktopWindow();HDC hDC = ::GetDC(hwnd);//获取屏幕DCRECT rect;::GetClientRect(hwnd, &rect);//获取屏幕大小HDC hDCMem = ::CreateCompatibleDC(hDC);//创建兼容DCHBITMAP hBitMap = ::CreateCompatibleBitmap(hDC, rect.right, rect.bottom);//创建兼容位图HBITMAP hOldMap = (HBITMAP)::SelectObject(hDCMem, hBitMap);//将位图选入DC,并保存返回值::BitBlt(hDCMem, 0, 0, rect.right, rect.bottom, hDC, 0, 0, SRCCOPY);//将屏幕DC的图象复制到内存DC中CImage image;image.Attach(hBitMap);image.Save(_T("c://B.jpg"));//如果文件后缀为.bmp,则保存为为bmp格式image.Detach();::SelectObject(hDCMem, hOldMap);//选入上次的返回值//释放::DeleteObject(hBitMap);::DeleteDC(hDCMem);::DeleteDC(hDC);return 0;}将当前MFC程序(这里是单文档程序)保存为图片,使用vs2005。

图像处理Bmp文件存储顺序

图像处理Bmp文件存储顺序

读写Bmp文件的方法步骤:读:1.读方式打开文件2.读入BITMAPFILEHEADER结构3.读入BITMAPINFOHEADER结构4.读入颜色表RGBQUAD结构5.读入位图数据6.关闭文件写:1.写方式打开文件2.填写BITMAPFILEHEADER结构并写入文件3.写入BITMAPINFHEADER结构并写入文件4.写颜色表进文件5.写位图数据进文件6.关闭文件①:位图文件头BITMAPFILEHEADER: (14字节)bfType :位图文件类型(0x4D42)bfSize :位图文件大小bfReserved1: Windows保留字1bfReserved2: Windows保留字2bfOffBits: 从文件头到实际位图数据的偏移字节数=文件头+ 信息头+调色板长度。

②:位图信息头(40字节)biSize: 本结构长度为40字节biWidth: 位图宽度,(像素为单位)biHeight: 位图的高度,(像素为单位)biPlanes: 设为1biCount: 位深度biCompression: 为0:不压缩;1:8位压缩;2:4位压缩。

biSizeImage:实际的位图数据占用的字节数biXPelsPerMeter:水平分辨率(像素/米)biYPelPerMeter: 垂直分辨率(像素/米)biClrCount:位图实际用到的颜色数(为0时,颜色数为2的biBitCount次幂)biClrImportant:位图显示过程中重要的颜色数(0:都是重要的)③:颜色表(4字节)rgbBlue:蓝色分量rgbGreen:绿色分量rgbRed: 红色分量rgbReserved:保留字节颜色表的大小:二值图像:大小=2*sizeof(RGBQUAD)=88位灰度图像:大小= 256*sizeof(RGBQUAD)= 102424位真彩色图像无颜色表④位图数据8位灰度图像ColorTablesize = 1024;lineByte =(bmpWidth * biBitCount / 8 + 3)/4 *4;1.申请位图文件头结构变量,并填写文件头信息BITMAPFILEHEADER fileHeader;fileHead.bfType = 0x4D42; //bmp类型//bfSize是图像文件4个组成部分之和fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAOINFOHEADER) + ColorTablesize + lineByte*Height;fileHeader.bfReserved1 = 0;fileHeader.bfReserved2 = 0;//bfOffBits是图像文件前3部分所需空间之和fileHead.bfOffBits = 54 + ColorTablesize;2.申请位图信息头结构变量,填写信息头信息BITMAPINFOHEADER head;head.biBitCount = biBitCount;head.biClrImportant = 0;head.biClrUsed = 0;head.biCompression = 0;head.biHeight = height;head.biSize = 40;head.biSizeImage = lineByte * height;head.biWidth = width;head.biXPelsPerMeter = 0;head.biYPelsPerMete = 0;3.写灰度图像的颜色表4.写位图数据进文件调色板句柄HPALETTE文件头指针LPBITMAFILEHEADER : m_lpDib信息头指针LPBITMAPINFOHEADER :m_lpBmpInfoHead 颜色表LPRGBQUAD : m_lpColorTable 信息指针LPBITMAPINFO :m_lpBmpInfo图像数据指针:m_pImgData (包括:信息头指针和颜色表)1读入一幅图像(即打开操作):将四部分都考虑进去(1,2,3,4);2写入一幅图像(即保存操作):将四部分都考虑进去(1,2,3,4)3显示一幅图像:只需将3部分考虑进去(2,3,4)4 处理一幅图像:只需将3部分考虑进去(2,3,4)位图显示和数据处理:将(位图信息头、颜色表)即:信息指针内容,位图数据指针依次写入,并进行操作。

MFC对话框打开一幅图片并在picture显示和图片保存

MFC对话框打开一幅图片并在picture显示和图片保存

学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。

一、首先要先了解bmp位图结构可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面&在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SAVE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数【然后在MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|",this);CFile bmpFile;pp文件头处添加BITMAPINFO* pBmpInfo;MP", NULL, NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if (!() == IDC_SAVE) return;strFileName = ();if (strFileName, CFile::modeCreate | CFile::modeReadWrite) == 0) return ;Widthbytes = (iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/* BITMAPFILEHEADER结构填写 */`= 0x4d42;=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);= + Widthbytes *iBmpHeight;= 0;= 0;/* BITMAPINFOHEADER结构填写 */= sizeof(BITMAPINFOHEADER);= iBmpWidth;=iBmpHeight;= 1;\= 24;//24位= BI_RGB;=0;= 0;= 0;= 0;= 0;(&bmpf,sizeof(bmpf));//写文件头;(&bmpi,sizeof(bmpi));//写信息头;|(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教。

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

第二课 bmp图片格式解析<一>.BMP格式定义BMP文件格式是Windows操作系统推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP。

BMP图像文件被分为4个部分:a.位图文件头b.位图信息头c.颜色表d.位图数据a.颜色表中RGBQUAD结构数据的个数有biBitCount来确定:当biBitCount=1,4,8时,分别有2,16,256个表项;当biBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader; // 位图信息头RGBQUAD bmiColors[1]; // 颜色表} BITMAPINFO;b.位图数据位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。

位图的一个像素值所占的字节数: 当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节;Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31)/ 8) * bi.biHeight。

<二>.BMP图片在MFC工程中的定义存在2个未解问题:a. bmp结构时我定义成系统自带的结构,否则会多2个字节在图片最后为CD;b. 在read中malloc只能申请4字节的空间,但fread(,m_nImage,)读入位图大小个。

第一步:添加BMP信息文件头文件—新建—创建ImageStruct.h—包含BMP格式的文件头部分的结构。

打开ImageStruct.h并添加代码:重点注意:1.bmp结构头必须定义成BITMAPFILEHEADER_ 不能定义成BITMAPFILEHEADER;因为在MFC中已存在BITMAPFILEHEADER的定义,在定义成它会显示重复定义。

同时自己定义的在View.h和View.cpp中注意引用#include “ImageStruct.h”。

2.在后面的引用bmp结构时我定义成系统自带的结构:BITMAPFILEHEADER bfh;BITMAPINFOHEADER bih;而不是BITMAPFILEHEADER_ ,因为MFC中用自带的定义图片头文件信息是正确的,但在位图信息块总会在文件最后多出2字节并默认为CD(0x16进制)。

原因可能是自定义的图片头文件少2字节,在后面补充了2字节。

(未知)/*******************************************************//* BMP位图文件包括4部分: *//* 位图文件头结构BITMAPFILEHEADER *//* 位图信息头结构BITMAPINFOHEADER *//* 位图颜色表RGBQUAD *//* 位图像素数据*//*******************************************************/#ifndef _IMAGESTRUCT_#define _IMAGESTRUCT_/*14byte BMP文件头含有BMP文件的类型、大小、位图文件的保留字、位图数据距文件头的偏移量*/typedef struct T_BITMAPFILEHEADER {WORD bfType; //2byte 位图文件的类型,必须为BM 0x424dDWORD bfSize; //4byte 位图文件的大小,以字节为单位WORD bfReserved1; //2byte 位图文件保留字,必须为0WORD bfReserved2; //2byte 位图文件保留字,必须为0DWORD bfOffBits; //4byte 位图数据距文件头的偏移量(字节)} BITMAPFILEHEADER_;/*40byte BMP位图信息头用于说明位图的尺寸等信息*/typedef struct T_BITMAPINFOHEADER {DWORD biSize; //本结构所占用字节数LONG biWidth; //位图的宽度,以像素为单位LONG biHeight; //位图的高度,以像素为单位WORD biPlanes; //目标设备的级别,必须为1WORD biBitCount;//每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)或24(真彩色)之一DWORD biCompression;//位图压缩类型,必须是0(不压缩)1(BI_RLE8压缩类型)或2(BI_RLE压缩类型)之一DWORD biSizeImage; //位图的大小,以字节为单位LONG biXPelsPerMeter; //位图水平分辨率,每米像素数LONG biYPelsPerMeter; //位图垂直分辨率,每米像素数DWORD biClrUsed; //位图实际使用的颜色表中的颜色数DWORD biClrImportant; //位图显示过程中重要的颜色数} BITMAPINFOHEADER_;/*BMP位图颜色表*/typedef struct T_RGBQUAD{BYTE rgbBlue; //蓝色的亮度(值范围为0~255)BYTE rgbGreen; //绿色的亮度(值范围为0~255)BYTE rgbRed; //红色的亮度(值范围为0~255)BYTE rgbReserved; //保留,必须为0} RGBQUAD_;#endif第二步:在..View.h中添加共有成员变量和成员函数1.找到..View.h头文件添加:#include "ImageStruct.h"2.在Class CBmpDrawView : public Cview中的public中添加成员变量函数:public://用来保存bmp格式图片bool SaveBmp(LPCSTR lpFileName);//用来读取bmp图片bool ReadBmp();//用来显示指定位图jpg、gif的函数bool ShowJpgGif(CDC* pDC,CString strPath, int x, int y);//用来显示指定位图bmp的函数void ShowBitmap(CDC* pDC,CString BmpName);/*CBitmap m_bitmaplin; 创建临时位图对象进行处理*/CBitmap m_bitmap; //创建位图对象CString EntName; //保存图像文件扩展名CString BmpName; //保存图像文件文件名int m_nWidth; //图像实际宽度int m_nHeight; //图像实际高度int m_nDrawWidth; //图像显示宽度int m_nDrawHeight; //图像显示高度DWORD m_nImage; //图像数据的字节数只含位图DWORD相当于long intDWORD m_nSize; //图像文件大小int m_nLineByte; //图像一行所占字节数int m_nBitCount; //图像每个像素所占位数int m_nPalette; //位图实际使用的颜色表中的颜色数/*注意:信息头必须条用系统bmp的结构BITMAPFILEHEADER 否则会多2字节*/ BITMAPFILEHEADER bfh; //全局变量文件头BITMAPINFOHEADER bih; //全局变量信息头RGBQUAD *m_pPal; //颜色表指针BYTE *m_pImage; //读入图片数据后的指针BYTE相当于unsigned char virtual ~CBmpDrawView();第三步:添加readbmp函数添加函数的方法:a.在View.h的public中直接添加函数bool ReadBmp()像第二步中一样;然后在View.cpp中添加函数:bool CBmpDrawView::ReadBmp(){}。

b.选中ClassView区--选中View类右键--增加成员变量函数—函数类型为bool—函数名为ReadBmp()—函数Access为public。

程序会自动在View.cpp中添加函数:bool CBmpDrawView::ReadBmp(){}。

c.添加代码://************************写入bmp格式图片过程***************************//bool CBmpDrawView::ReadBmp(){FILE *fp = fopen(BmpName,"rb"); //读取bmp图片BmpName为图片的绝对路径if(fp==0) { AfxMessageBox("无法打开文件!",MB_OK,0); return 0; }/*读取文件头全局变量bfh BITMAPFILEHEADER 定义在ImageStruct中*//*解决BMP格式倒置的方法(CSDN) fread(&bfh,sizeof(BITMAPFILEHEADER),1,fp);倒置*/ fread(&bfh.bfType,sizeof(WORD),1,fp);fread(&bfh.bfSize,sizeof(DWORD),1,fp);fread(&bfh.bfReserved1,sizeof(WORD),1,fp);fread(&bfh.bfReserved2,sizeof(WORD),1,fp);fread(&bfh.bfOffBits,sizeof(DWORD),1,fp);m_nSize = bfh.bfSize; //图像文件的总字节数/*判断是否是bmp格式图片'BM'*/if(bfh.bfType!=0x4d42) { AfxMessageBox("不是BMP格式图片!",MB_OK,0); return 0; }/*读取信息头*//*解决BMP格式倒置的方法fread(&bih,sizeof(BITMAPINFOHEADER),1,fp);倒置*/fread(&bih.biSize,sizeof(DWORD),1,fp);fread(&bih.biWidth,sizeof(LONG),1,fp);fread(&bih.biHeight,sizeof(LONG),1,fp);fread(&bih.biPlanes,sizeof(WORD),1,fp);fread(&bih.biBitCount,sizeof(WORD),1,fp);fread(&bih.biCompression,sizeof(DWORD),1,fp);fread(&bih.biSizeImage,sizeof(DWORD),1,fp);fread(&bih.biXPelsPerMeter,sizeof(LONG),1,fp);fread(&bih.biYPelsPerMeter,sizeof(LONG),1,fp);fread(&bih.biClrUsed,sizeof(DWORD),1,fp);fread(&bih.biClrImportant,sizeof(DWORD),1,fp);if(bih.biSize!=sizeof(bih)) { AfxMessageBox("本结构所占用字节数出现错误"); return 0; }/*位图压缩类型:必须是0(不压缩)、1(BI_RLE8压缩类型)、2(BI_RLE压缩类型)之一*/ if(bih.biCompression == BI_RLE8 || bih.biCompression == BI_RLE4){ AfxMessageBox("位图被压缩!"); return 0; }/*获取图像高宽和每个像素所占位数*/m_nHeight = bih.biHeight;m_nWidth = bih.biWidth;m_nDrawHeight = bih.biHeight;m_nDrawWidth = bih.biWidth;m_nBitCount = bih.biBitCount; //每个像素所占位数/*计算图像每行像素所占的字节数(必须是4字节的倍数) 2种方法*///m_nLineByte = (m_nWidth*m_nBitCount/8+3)/4*4;m_nLineByte = (m_nWidth*m_nBitCount+31)/32*4;/*计算图片位图的大小长*宽*3为24位bmp位图大小3表示rgb*/m_nImage = m_nLineByte * m_nHeight;/*位图实际使用的颜色表中的颜色数biClrUsed 注:24位bmp不用改参数*/m_nPalette = 0;if(bih.biClrUsed) m_nPalette = bih.biClrUsed;/*申请位图空间大小为位图大小m_nImage*//*注意:malloc只能申请4字节的空间(未知) 但fread(,m_nImage,)读入位图大小个*/ m_pImage=(BYTE*)malloc(m_nImage);fread(m_pImage,m_nImage,1,fp);/*注意:要关闭fp*/fclose(fp);return true;}第四步:添加保存menu控件和函数a.查看--建立类导向(Ctrl+W)--CpictureXSView(类名)--ID_FILE_SAVE(IDs 列表)--COMMAND(Messages列表)--默认成员函数名为OnFileSave --Member Functions(成员函数)中双击该函数进入函数编辑。

相关文档
最新文档