VC++图像应用——图像显示
VC界面显示图片

VC界面显示图片(JPG JPEG GIF)2007-12-23 02:14一、引言JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛的认可。
GIF格式虽然仅支持256色但它对于颜色较少的图像有着很高的压缩率,甚至超过JPEG标准,也得到了广泛的认同。
但作为众多程序员的一个重要的开发工具--Microsoft Visual C++ 6.0的MFC库却仅对没有经过任何压缩的BMP位图文件有着良好的支持,可以读取、显示、存储甚至在内存中创建一块内存位图。
由于BMP格式的图像没有经过任何的压缩,不论是作为程序的外部文件,还是作为程序的内部资源都要占据大量的空间,尤其是后者会大大增加可执行文件的长度。
可以看出,如果能用经过压缩、具有较好的压缩率的JPEG或GIF格式的图像来取代BMP文件在VC中的应用,无疑还是很有吸引力的。
二、设计思路虽然有一些操作、处理JPEG、GIF等其他格式图像的Active X控件,但总的来说使用起来并不太方便,笔者经过实验摸索,总结出了一种借助于COM接口的OLE方法来实现上述功能的一种简便方法,现介绍如下以飨广大读者:下面我们要使用IPicture 的COM接口,有必要对该图像接口做些了解:该接口主要管理图像对象及其属性,图像对象为位图、图标和图元等提供一种与语言无关的抽象。
和标准的字体对象一样,系统也提供了对图像对象的标准实现。
其主要的接口是IPicture和IPictureDisp,后者是由IDispatch接口派生以便通过自动化对图像的属性进行访问。
图像对象也支持外部接口IPropertyNotifySink,以便用户能在图像属性发生改变时作出决定。
图像对象也支持IPersistStream接口,所以它能从一个IStream接口的实例对象保存、装载自己,而IStream 接口也支持对流对象的数据读写。
在VC中使用CVI控件实现图形显示与缩放

分 辨力 =±
×被 测 量
() 2
CWGrp a h显示控件 , 通过 自动定标的方法实现 波形的合理显示 , 以及 在相关的算法下实 现波形 的缩放 。实 验证 明这些 在 VC环境 下利 用 C I V 控件使得测控软件能高效率开发 , 且结果切实有效 , 具有很强的针 对性和通用性。 关键词 : 面向对象 ; VIC C ; WGmp ; h 自动定标 ; 缩放 中图分类号 : P 1 .6 T 3 15 文献标识码 : B
结合 C I V 提供的仪器控件库和函数库, 将这些控件用于 V c环
境下 , 便可使设计人员将精 力专注 于程序 的主要功 能, 而使 从 开发简便易行 , 开发 出高质量 的测控软件 。 2 软 件 需 求 ,
按照调制域分析 仪项 目要 求 , 主控 软件在 前 台用户 操作 界面的同时 , 接收结果数据并 合理 的在 屏幕上 布局显示 , 并且 实现波形的缩 放功 能对结 果进 行细 微或全 面 的观察 , 以及一 定精度下对波形抖 动等 测量特性 的观察 。本 软件 中通 过选用 Lb no sC I aWidw/ V 控件在仪器图像显示上有更好 的针对性 。 在本 工程 中 主要 使 用 了 比 MS hr 控 件 更 优 越 的 C C at W- GahC n o控件 。利用面向对象的思想 , rp ot l r 通过生 成 C irp NGah 类的对象 m— w rp , 以设置显 示的 M re、 cg h可 a akr 坐标 、 图形 等 , 以下是利用 m_w rp c g h进行 图像显示的具体操作。 a
应用CImage类用文件和流的方式显示图片和放大缩小图片

应⽤CImage类⽤⽂件和流的⽅式显⽰图⽚和放⼤缩⼩图⽚1.是MFC⼯程2.创建默认⼯程:单⽂档⼯程3.⼯程名:JPEGTest4.1在CJPEGTestView类中添加HANDLE m_hFile;CImage m_Image;void LoadMemImage( void * pMemData, long len);afx_msg void OnFileOpen();4.2在stdafx.h中添加#include4.3在CJPEGTestView.cpp中添加BEGIN_MESSAGE_MAP(CJPEGTestView, CView)ON_COMMAND(ID_FILE_OPEN, &CJPEGTestView::OnFileOpen)//这个是添加的END_MESSAGE_MAP()4.4void CJPEGTestView::OnFileOpen(){CString strFilter;CSimpleArray aguidFileTypes;HRESULT hResult;// 获取CImage⽀持的图像⽂件的过滤字符串hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files") );if ( FAILED(hResult) ){MessageBox(_T("GetExporterFilter调⽤失败!"));return;}CFileDialog dlg( TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter );if ( IDOK != dlg.DoModal() )return;m_Image.Destroy();{//在此处是⽤流的⽅式显⽰JPEGm_hFile = ::CreateFile(dlg.GetFileName(),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); // ⽤这个函数⽐OpenFile好if ( m_hFile == INVALID_HANDLE_VALUE){MessageBox(_T("打开⽂件失败"));CloseHandle( m_hFile ); // ⼀定注意在函数退出之前对句柄进⾏释放。
实验一VC环境下实现图形显示-Read

(2)在GraphExpDoc.h中包含头文件,代码如下:
#include "Line.h"
#include <vector>
using namespace std;
并在CGraphExpDoc类中添加如下代码:
protected:
vector <CLine> m_vLines;//存放直线
public:
void AddLine(CPoint pntStart, CPoint pntEnd);
CLine GetLine(int index);
int GetLineNumber();
(3)在GraphExpDoc.cpp添加如下代码:
void CGraphExpDoc::AddLine(CPoint pntStart, CPoint pntEnd)
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,
(HBRUSH)::GetStockObject(WHITE_BRUSH),0);
5.建立并运行程序,用鼠标在其中画各种直线。
三、定义直线类并在文档类中保存直线
上述运行的程序可以在用户区绘制直线了,但当移动窗口或改变窗口大小时,屏幕上的图形立即不见了。这是由于当窗口改变时,应用程序首先清除屏幕,然后调用视图类的OnDraw成员函数重新绘制窗口。但前面的步骤中,我们还没有保存所画直线的代码。为此,必须在文档类中添加能存放直线的文档数据。对于用户在视图窗口中所画的直线,可以在文档中添加数据成员来存放直线的坐标,以便在重画窗口时可以恢复直线。
pCmdUI->Enable(m_vLines.size()); //仅当至少有一条直线时Undo命令才有效
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位图打开和显示课程名称:数字图象处理实验名称:用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”。
C语言——图形显示.ppt
关闭图形方式:
closegraph();
• 清屏和恢复显示方式函数
– void cleardevice(void);
– void closegraph(void); 关闭图形系统回到文本模式 – 基本图形函数
(0,0)
x
y 分辨率:640 480
– 图形系统的初始化 • 图形系统初始化函数
– void initgraph(int *driver,int *mode,char *pathtodriver)
– initgraph(驱动程序地址,显示模式地址, 驱动程序文件的路径);
– 其中; »driver——显示适配器驱动程序的枚举变量 »mode——图形模式(模式号或模式标识符) »pathtodriver——适配器驱动程序的寻找路径, “”表示在当前目录下(*.BGI)
例3:画图,综合例子
# define PAI 3.1415926 # define B 0.809 # include "graphics.h" #include "math.h" main() {
int i,j,k,x0,y0,x,y,driver,mode; float a; driver=CGA;mode=CGAC0; initgraph(&driver,&mode,""); setcolor(3); setbkcolor(GREEN); x0=150;y0=100; circle(x0,y0,10); circle(x0,y0,20); circle(x0,y0,50);
vc显示图像
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
return E_FAIL;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic->Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
VC++显示图像的几种方法及获取DC的方法
VC++显⽰图像的⼏种⽅法及获取DC的⽅法⼀、获取DC⽅法为了进⾏绘图,必须获得⼀个设备描述表DC。
有多种⽅式获得DC:1、利⽤windows SDK全局函数获得HDC hdc;Hdc=::GetDC(m_hWnd);…::ReleaseDC(m_hWnd,hdc);2、利⽤MFC的CDC封装类实现CDC *pDC=GetDC();…ReleaseDC(pDC);3、利⽤MFC的CClientDC类实现,此类派⽣于CDC类,并在构造函数中调⽤GetDC,在析构函数中调⽤ReleaseDC。
CClientDC dc(this);This指针代表CClientDC对象所属的类对象,如视图类CXXView⼆、有多种⽅法实现在窗⼝中显⽰位图:1、BitBlt函数和StretchBlt函数(属于CDC类)(1)创建位图CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP); //加载应⽤程序中的资源位图(2)创建兼容DCCDC dcCompatible; dcCompatible.CreateCompatibleDC(pDC);(3)将位图选⼊兼容DC中dcCompatible.SelectObject(&bitmap);(4)将兼容DC中的位图贴到当前DC中pDC->BitBlt(rect.left,rect.top,rect.width,rect.height,&dcCompatible,0,0,SRCCOPY);BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,DWORD dwRop);x和y指定⽬标矩形左上⾓的坐标。
nWidth,nHeight指定⽬标矩形区域宽度和⾼度。
xSrc和ySrc指定源矩形区域左上⾓的x和y坐标。
得到rect GetClientRect(&rect);BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,int nSrcWidth,intnSrcHeight,DWORD dwRop);StretchBlt函数⽐BitBlt函数多了两个参数nSrcWidth和nSrcHeight,表⽰原矩形的宽度和⾼度。
VC中图像控件的用法与总结
VC中图像控件的用法与总结使用picture控件动态显示图片方法一控件适应于图片尺寸添加一个picture控件,修改ID为IDC-PICTURE,并添加一CBitmap m_bmp成员变量在OnInitDialog()函数中添加如下代码if(m_bmp.m_hObject!=NULL) m_bmp.DeleteObject();//以绝对路径加载BMP图片HBITMAPhbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.b mp",IMAGE_BITMAP, 0,0,LR_CREATEDIBSECTION | LR_LOADFROMFILE);if(hbmp==NULL) return false;//获得加载位图的文件信息m_bmp.Attach(hbmp);DIBSECTION ds;BITMAPINFOHEADER &bminfo=ds.dsBmih;//获得位图信息图m_bmp.GetObject(sizeof(ds),&ds);int cx=bminfo.biWidth;//获得位图宽度int cy=bminfo.biHeight;//获得位图高度//该段程序根据图象的宽和高,调整控件大小,让它正好显示一张图片CRect rect;GetDlgItem(IDC_PICTRUE)->GetWindowRect(&rect);//获得控件所在矩形区域ScreenToClient(&rect);GetDlgItem(IDC_PICTRUE)->MoveWindow(rect.left,rect.top, cx,cy,true);//调整控件大小在OnPaint()函数中添加如下代码//三种方法获得pictrue控件DC,图象将被绘制在控件上CPaintDC dc(GetDlgItem(IDC_PICTRUE));//CPaintDC dc(this);//CDC dc;//dc.m_hDC=::GetDC(NULL);CRect rcclient;GetDlgItem(IDC_PICTRUE)->GetClientRect(&rcclient);CDC memdc;memdc.CreateCompatibleDC(&dc);CBitmap bitmap;bitmap.CreateCompatibleBitmap(&dc,rcclient.Width(),rcclie nt.Height());memdc.SelectObject(&bitmap);CWnd::DefWindowProc(WM_PAINT,(WPARAM)memdc.m_h DC,0);CDC maskdc;maskdc.CreateCompatibleDC(&dc);CBitmap maskbitmap;maskbitmap.CreateBitmap(rcclient.Width(),rcclient.Height(), 1,1,NULL);maskdc.SelectObject(&maskbitmap);maskdc.BitBlt(0,0,rcclient.Width(),rcclient.Height(),&memdc, rcclient.left,rcclient.top,SRCC OPY);CBrush brush;brush.CreatePatternBrush(&m_bmp);dc.FillRect(rcclient,&brush);dc.BitBlt(rcclient.left,rcclient.top,rcclient.Width(),rcclient.Hei ght(),&memdc,rcclient.left,rcclient.top,SRCPAINT);brush.DeleteObject();二图片适用于控件尺寸添加一个picture控件,修改ID为IDC-PICTURE在OnPaint()函数中添加如下代码CWnd *pWnd=GetDlgItem(IDC_PICTRUE);//获得pictrue控件窗口的句柄CRect rect;pWnd->GetClientRect(&rect);//获得pictrue控件所在的举行区域CDC *pDC=pWnd->GetDC();//获得pictrue控件的DCIStream *pStm;CFileStatus fstatus;CFile file;LONG cb;IPicture *pPic;//定义显示图片的接口(可显示jpg格式图片)CString m_sPath="1.BMP";//设置想要显示的图片//打开图象文件,获取文件字节数if(file.Open(m_sPath,CFile::modeRead) && file.GetStatus(m_sPath,fstatus)&& ((cb=fstatus.m_size)!=-1)){//分配全局存储空间HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,cb);LPVOID pvData=NULL;if(hGlobal!=NULL){//锁定分配内存块if((pvData=GlobalLock(hGlobal))!=NULL){//读入文件到内存缓冲区file.ReadHuge(pvData,cb);GlobalUnlock(hGlobal);CreateStreamOnHGlobal(hGlobal,true,&pStm);}}}//装载图象文件if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID _IPicture,(LPVOID*)&pPi c))){OLE_XSIZE_HIMETRIC hmWidth;OLE_XSIZE_HIMETRIC hmHeight;pPic->get_Width(&hmWidth);//获得图象真实宽度pPic->get_Height(&hmHeight);//获得图象真实高度//在控件上显示图片pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeigh t,hmWidth,-hmHeight,NULL);pPic->Release();}图片显示通用模块首先为类添加如下两个函数和一个成员变量IPicture* m_pPicture;//图片加载函数HRESULT LoadFromBuffer(BYTE *pBuff, int nSize){bool bResult=false;HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,nSize);//分配内存空间void *pData=GlobalLock(hGlobal);//定义图象数据指针memcpy(pData,pBuff,nSize);GlobalUnlock(hGlobal);//释放内存空间IStream *pStream=NULL;//定义数据流指针//创建数据流if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStream)==S_OK){HRESULT hr;//定义返回结果if((hr=OleLoadPicture(pStream,nSize,FALSE,IID_IPicture,(LPV OID*)&m_pPicture))==S_ OK)bResult=true;pStream->Release();//释放数据流}return bResult;}//图片显示函数BOOL DrawFromFile(CString filename, CDC *pDC){CFile cFile;CFileException e;//打开文件if(cFile.Open(filename,CFile::modeRead | CFile::typeBinary,&e)){BYTE *pBuff=new BYTE[cFile.GetLength()];//定义分配内存if(cFile.Read(pBuff,cFile.GetLength())>0)//将文件读入缓存LoadFromBuffer(pBuff,cFile.GetLength());delete []pBuff;//释放缓存long hmWidth,hmHeight;m_pPicture->get_Width(&hmWidth);m_pPicture->get_Height(&hmHeight);//获取图片尺寸intnWidth=MulDiv(hmWidth,pDC->GetDeviceCaps(LOGPIXELSX),2 540);intnHeight=MulDiv(hmHeight,pDC->GetDeviceCaps(LOGPIXELSX), 2540);//在内存中画CDC MenDC;CBitmap bmp;bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);MenDC.CreateCompatibleDC(NULL);MenDC.SelectObject(&bmp);m_pPicture->Render(MenDC.m_hDC,0,0,nWidth,nHeight,0,h mHeight,hmWidth,-hmHeight, NULL);//将内存中画拷贝到目的地pDC->BitBlt(0,0,nWidth,nHeight,&MenDC,0,0,SRCCOPY);}return true;}然后在OnPaint()函数中显示void CDialogDlg::OnPaint(){CPaintDC dc(this); // device context for paintingif (IsIconic()){SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon); }else{CString filename;filename="1.bmp"; DrawFromFile(filename,&dc); CDialog::OnPaint();}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++图像应用指南一——图像显示
一、设备上下文中绘制图像
1.穿建一个单文档/视图结构的应用程序
2.1在视图类的OnDraw编写如下代码
1.点击文件→选择新建→选择MFC APP ;填写工程名;点击确认→
2.选择单文档→点击完成void COUtView::OnDraw(CDC* pDC)
{
COUtDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.LoadBitmap(IDB_BKBITMAP);
memDC.SelectObject(&bmp);
pDC->BitBlt(30,20,180,180,&memDC,1,1,S RCCOPY);
CRect rc(30,20,210,200);
CBrush brush(RGB(0,0,0));
pDC->FrameRect(rc,&brush);
rc.OffsetRect(220,0);
BITMAP BitInfo;
bmp.GetBitmap(&BitInfo);
int x=BitInfo.bmWidth;
int y=BitInfo.bmHeight;
pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc .Height(),&memDC,0,0,x,y,SRCCOPY);
pDC->FrameRect(rc,&brush);
brush.DeleteObject();
memDC.DeleteDC();
bmp.DeleteObject();
}
2.2程序
3.运行程序出现IDB_BKBITMAP不存在
4.成功运行程序
左图使用了BitBlt方法,在区域中只显示部分
图像;右图使用了SretchBlt方法,在区域中
显示完整图像,图像被收缩了
二、从磁盘中加载图像到窗口中
1.穿建一个单文档/视图结构的应用程序
2.在视图类中添加一个成员变量m_hBmp
1.点击文件→选择新建→选择MFC APP ;填
写工程名;点击确认→
2.选择单文档→点击完成
HANDLE m_hBmp
3.在视图类的构造函数中调用LoadImage方法从磁盘中加载文件
4.1在视图类中OnDraw方法中绘制位图,代码如下:
CMy456View::CMy456View()
{
m_hBmp=LoadImage(NULL,"Demo.bmp",I MAGE_BITMAP,0,0,LR_LOADFROMFILE);
} void CMy456View::OnDraw(CDC* pDC)
{
CMy456Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmap bmp;
bmp.Attach(m_hBmp);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&bmp);
BITMAP BitInfo;
bmp.GetBitmap(&BitInfo);
int x=BitInfo.bmWidth;
int y=BitInfo.bmHeight;
pDC->BitBlt(0,0,x,y,&memDC,0,0,SRCCOPY );
bmp.Detach();
memDC.DeleteDC();
}
4.2程序
5运行程序
三、显示JPEG图像
1.创建单文档/视图结构的应用程序
2.向视图类中添加成员变量
1.点击文件→选择新建→选择MFC APP ;填写工程名;点击确认→
2.选择单文档→点击完成HGLOBAL hMem;
OLE_YSIZE_HIMETRIC m_JPGHeight; OLE_XSIZE_HIMETRIC m_JPGWidth; IPicture *m_pPicture;
IStream *m_pStream;
3.视图构造函数中从磁盘加载JPEG图像到流中CMy654View::CMy654View()
{CFile file;
file.Open("ddf.jpg",CFile::modeReadWrite); DWORD len=file.GetLength();
hMem=GlobalAlloc(GMEM_MOVEABLE,len); LPVOID pData=NULL;
pData=GlobalLock(hMem);
file.ReadHuge(pData,len);
file.Close();
GlobalUnlock(hMem); CreateStreamOnHGlobal(hMem,TRUE,&m_pStr eam);
OleLoadPicture(m_pStream,len,TRUE,IID_IPictu re,(LPVOID*)&m_pPicture);
m_pPicture->get_Height(&m_JPGHeight);
m_pPicture->get_Width(&m_JPGWidth);}
4.在视图类OnDraw方法中绘制JPEG图像
5.运行
m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_
JPGWidth/26.45),(int)(m_JPGHeight/26.45),0,m
_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL);
四、根据位图数据直接绘图/使用SretchDIBits根据数据流绘制图像
1.创建单文档/视图结构的应用程序
2.在视图类中定义一个缓冲区,用于存储数据
流
char *m_pBmpData;
1.点击文件→选择新建→选择MFC APP ;填
写工程名;点击确认→
2.选择单文档→点击完成
3.2程序
3.1在视图类的构造函数中读取文件到数据
流中
CMy627View::CMy627View()
{ CFile file;
file.Open("bk.bmp",CFile::modeReadWrit
e);
int len=file.GetLength();
file.Seek(14,CFile::begin);
m_pBmpData=new char[len-14];
file.Read(m_pBmpData,len-14);
file.Close();}
4.1在视图类的析构函数中释放缓冲区 4.2程序
CMy627View::~CMy627View()
{
delete m_pBmpData;
}
5.1向视图类中添加一个成员函数,根据数据
5.2程序
流输出图像
void CMy627View::OutputStream(char
*pStream)
{
char *pHeader=pStream;
BITMAPINFO BitInfo;
memset(&BitInfo,0,sizeof(BITMAPINFO));
memcpy(&BitInfo,pHeader,sizeof(BITMAPI
NFO));
int x=BitInfo.bmiHeader.biWidth;
int y=BitInfo.bmiHeader.biHeight;
pHeader+=40;
StretchDIBits(GetDC()->m_hDC,0,0,x,y,0,0,
x,y,pHeader,&BitInfo,DIB_RGB_COLORS,SRCCO
PY);
}
7.向程序中添加图像6.在视图类的OnDraw方法中调用
OutputSteam方法绘制图像
void CMy627View::OnDraw(CDC* pDC)
{
CMy627Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
OutputStream(m_pBmpData);
}
8.成果运行程序。