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();}}。
基于VC的图像特效显示研究设计
基于VC++的图像特效显示研究作者姓名:XXX专业名称:电子信息科学与技术指导教师:XXX讲师摘要图像的特效显示在计算机技术领域应用广泛,Windows的屏幕保护程序就采用了各种各样的图像特效显示,使人感到耳目一新。
本论文阐述了基于VC++设计图像特效显示的基本原理和方法,研究了现有的扫描特效显示、栅条特效显示、马赛克特效显示,并分析了这些显示的相关算法,通过研究创新设计出两个特效显示——渐变百叶窗特效和泡泡腐蚀特效,介绍了这两个特效显示的算法实现及软件界面的设计实现过程。
界面是基于Microsoft Visual C++ 6.0 MFC多文档编程的图像处理界面,实现.bmp格式图像的浏览与编辑,导入和导出,图像特效显示,边缘检测,旋转和翻转图片,图片增强优化,以及打印输出图片。
是一款功能较简洁的数字图像管理界面,实现对.bmp格式图像的操作。
该界面包含两部分:启动界面和主界面。
BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,一般来说BMP文件分成4个部分:位图头文件,位图信息头,颜色表,位图数据.同时BMP文件文件可以分为DIB格式和DDB格式,其中DIB格式是与设备无关的BMP文件,通用性很强.Windows支持一些重要的DIB访问函数,但都没有封装到MFC中,这里我们封装了一个DIB类,其包含DIB文图处理所需要的基本成员变量和成员函数,进而以该类为基类派生其他类,实现程序的维护和移植,从而利用面向对象的方式实现图像的可视化编程。
关键词:特效显示;扫描;栅条;马赛克;VC++;数字图像处理AbstractSpecial effects show for images is applied in the field of computer technology widely. The Windows screen savers use a variety of image special effects which feel refresh. This paper describes the basic principles and methods of image special effects show based on VC++. The algorithm of the effect shows including scanning special effect show, bar special effect show and mosaic special effect show are studied. This paper also designes two special effects——Gradually changing blinds and corroding bubble. The implementation of the display algorithm and software interface designment are realized in this paper.The digital image processing interface is based on Micros oft Visual C + +6.0 MFC multi-document image processing programming interfa ce, to achieve. Bmp format for image browsing and editing, import and export, image effects showed that edge detectio n, rotate and flip images, pictures enhance the optimization , as well as print output picture. Is a function of the digital image than the simple management interface, to achie ve. Bmp format images of the operation. The interface conta ins two parts: interface and the main interface to start.BMP file is a Windows operating system and suppor t the recommended image file format, is a memory or displa y the compressed image data is not directly based on digit al archiving of file formats, BMP files are generally divid ed into four parts: the first bitmap documents, BITMAPINFOHE ADER, color table, the bitmap data. At the same time, BMP file formats and can be divided into DIB format DDB, DIB format which has nothing to do with the equipment of the BMP files, a strong GM. Windows in support of the DIB t o visit a number of important function, but are not packaged in the MFC, where we have a package type DIB, the DIB includes Ventura needed to deal with members ofthe basic variables and member functions, and such a b ase class for other types of derivatives, the realization o f the procedure maintenance and transplantation, and thus th e use of object-oriented way of programming the visual imag e.Key words: Special effects show,scanning, bar; mosaic,VC + +目录摘要 (I)Abstract (II)目录 (III)1 数字图像发展概述 (1)1.1 数字图像引言 (1)1.2 数字图像简史 (2)1.3 数字图像现状 (3)1.4 数字图像未来方向 (3)2 基于VC++图像显示的理论基础 (5)2.1 Microsoft Visual C++编程概述 (5)2.1.1 Windows程序特点 (5)2.1.2 C++语言 (6)2.1.3 Microsoft Visual C++ 6.0环境 (6)2.1.4 MFC简介 (7)2.1.5 图形设备接口、GDI对象 (7)2.2 OpenCV的简介 (8)2.2.1 OpenCV概述 (8)2.2.2 OpenCV的特点 (9)3 常见的图像特效显示 (10)3.1显示特效方法理论概述 (10)3.1.1特效显示基础 (10)3.1.2显示特效过程 (10)3.1.3显示特效类 (11)3.2 栅条显示 (12)3.2.1栅条显示特效的特效预览 (12)3.2.2 基本原理和实现方法 (12)3.3 马赛克显示特效 (14)3.3.1 马赛克显示特效的特效预览 (14)3.3.2基本原理和实现方法 (15)3.3.3 编程实现 (16)3.4 移动显示特效 (18)3.4.1 移动显示特效显示预览 (18)3.4.2基本原理和实现方法向右移动 (18)3.4.3 编程实现 (20)3.5 百叶窗显示特效 (21)3.5.1 基本原理和实现方法 (21)3.5.2 基本原理和实现方法 (22)3.5.3 编程实现 (23)3.6 对于常见特效显示算法的改进 (25)4 设计一个图像浏览工具GraphShower (26)4.1 两个特效显示及其算法 (26)4.1.1 渐变百叶窗显示 (26)4.1.2 泡泡腐蚀显示 (30)4.2 VC++程序界面设计 (35)4.2.1 CDC类的派生类设计 (35)4.2.2 CDialog类的派生类的成员函数设计 (36)4.2.3 基本窗口设计 (37)4.3 测试分析及总结 (38)结语 (40)致谢 (42)参考文献 (43)1 数字图像发展概述1.1 数字图像引言数字图像处理就是用计算机对图像进行分析和处理,它是一门跨学科的技术。
vc++数字图像处理MFC图像显示具体步骤
vc++数字图像处理MFC图像显⽰具体步骤vc++数字图像处理MFC 图像显⽰具体步骤1、建⽴当⽂档⼯程步骤⼀:建⽴⼯程进⼊vc集成开发环境,单击File菜单下的new,出现⼀个对话框,在对话框中选择Project项⽬,选中MFC AppWinzid (exe),并填写好项⽬名称,存储路径,点击OK.进⼊下⼀步,在出现的页⾯中选择当⽂档模式(Single document),单击完成(Finish),即可。
步骤⼆:编译⼯程单击Build菜单下的Execute test.exe(或单击⼯具栏中的! )编译⼀下刚才建⽴的项⽬。
即可看到⼀个如下图1.3的windows 风格窗⼝。
图1.322、添加CDIB 类步骤⼀:将dib.cpp 和dib.h ⽂件(已发给⼤家)拷贝到⼯程⽬录下。
步骤⼆:打开⼯程空间(双击刚才建⽴的⽬录下的test.dsw) 。
单击在编译窗⼝中的Project →Add ToProject →Files ,在弹出的对话框中选择dib.cpp 和dib.h 。
单击确定。
步骤三:在类视图中查看是否有CDIB 类(如下图1.4),如果没有请重复步骤⼀。
图1.43、建⽴菜单项步骤⼀、点击ResouceView。
双击资源中的MEUM->IDC_MAINFRAME。
在编辑框中将看到主框架的菜单资源(如图.5).如图1.5步骤⼆、在菜单资源中,添加菜单栏和菜单项。
双击其中的⼀个空⽩菜单栏,即进⼊其熟悉框,可添加或修改其名称,这⾥将其命名为(图像操作),如图1.6.4图1.6步骤三、在“图像操作栏”中添加菜单项――“打开图像”。
具体步骤见图1.7。
步骤四、编译(单击!),将出现如图1.8的界⾯,如果没有出现菜单栏和菜单项,请重复到步骤⼀。
图1.84、添加CTestView的公共成员函数m_dib按照如图1.9中的提⽰操作,添加CTestView的公共成员函数m_dib.图1.95、添加响应函数步骤⼀、右击编辑框中的任意位置,在弹出的提⽰菜单中,选择ClassWizard,在弹出的类向导对话框中,按照如图1.10的提⽰进⾏选择和操作。
VC工具栏显示图像
VC工具栏显示图像VC工具栏显示图像一个好的软件,界面非常重要,其中的功能要让客户一目了然。
而这些可以借助于工具栏,如在Microsoft Word中的工具栏,相关的操作基本上都可以借助工具栏来完成。
下面,我就将我知道的关于VC 中关于工具栏的一些东西写写,与大家共享,不对的地方请大家帮忙纠正。
下面我以Visual /doc/0a7919925.html, 2003下的单文档/视图的程序为例说明。
在VS中,实现工具栏的类是CT oolBar, 在新建一个单文档/视图程序的时候,在框架类的OnCreate中,系统会自动创建一个工具条。
如下:if (!m_wndT oolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}方法一:想要修改或者增加工具栏中的内容,一种方法是进入“资源视图”,然后选择"ToolBar",然后对工具栏中的内容进行修改或者添加,并为它们添加响应消息。
这是最简单,有时候也是最直接有效的方法。
方法二:如果你想创建一个更加符合自己要求的工具条,而不想被资源视图中的ToolBar所限制的话,那么你可以自己写程序来Create ToolBar. 这样的话,你只需要将上面工程自动生成的那段代码注释掉,然后自己写一个函数,这里取名为CreateExToolBar(); 然后用这个函数代替上面这段代码。
然后加入自己特色的工具条代码,当然,先还是要创建一个工具条,如下:if (!m_wndT oolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)){return -1;}注意,不要m_wndToolBar.LoadToolBar(IDR_MAINFRAME),这样,你就可以在新建的工具条中想干什么就干什么。
VC下显示JPG,GIF图象的方法
VC下显示JPG,GIF图象的方法VC下显示JPG,GIF的图像的显示就程序开发过程中要用到的一个模块,今天我们就来谈一谈它的具体的实现方法。
在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString型的变量m_sPath中:CFileDialog dlg(TRUE,\"jpg\",\"*.jpg\",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,\"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||\",NULL);if(dlg.DoModal()==IDOK){m_sPath=dlg.GetPathName();Invalidate();}为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:IStream *pStm;CFileStatus fstatus;CFile file;LONG cb;……if (file.Open(m_Path,CFile::modeRead)&&file.GetStatus(m_Path,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);}}}然后,就直接调用OleLoadPicture函数从流中装载图像:IPicture *pPic;……OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)) ;由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LP VOID*)&pPic))){OLE_XSIZE_HIMETRIC hmWidth;OLE_YSIZE_HIMETRIC hmHeight;pPic->get_Width(&hmWidth);pPic->get_Height(&hmHeight);double fX,fY;……fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL )))AfxMessageBox(\"渲染图像失败!\");pPic->Release();}elseAfxMessageBox(\"从流中装载图像失败!\");其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。
VC++读取图像数据显示方法
对图像数据的读取显示Visual C++中实现对图像数据的读取显示在利用VC进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库中读取出来并显示,图像数据与文本字段不同,它是作为OLE字段在数据库中存储,通过数据集对象的成员变量自动交换得到的图像数据,得到的数据并不能直接显示,如何处理图像数据,一直是数据库编程中的一个难点,目前关于VC进行数据库编程的资料不少,但很少涉及图像数据的操作,笔者针对一现状,结合自己开发的一个项目,解决了如何显示数据库中的图像这一问题,本文以操作ACESS数据库为例子,讲解一下自己的实现思路,希望对爱好VC编程的朋友们有所帮助,以起到抛砖引玉的作用。
为了简化问题,该数据库的表中只有一个名为Images的OLE字段,我使用DAO连接操作数据库,读取的图像数据显示在一个对话框上,至于使用ODBC、DAO还是ADO,这要根据具体情况而定,但无论使用哪一种,对图像的显示来说,实现的过程是大同小异的。
由于篇幅有限,文章中对如何实现数据库的连接不再作具体的说明,有兴趣的读者朋友可以参考VC数据库编程的资料。
实现过程中,首先定义一个CDaoRecordset的子类CimageData如下:class CimageData : public CDaoRecordset{public:CimageData (CDaoDatabase* pDatabase = NULL);DECLARE_DYNAMIC(CimageData)file://{{AFX_FIELD(CimageData, CDaoRecordset)CByteArray m_Images;//声明字节数组用来存放图像数据file://}}AFX_FIELD// Overrides// ClassWizard generated virtual function overridesfile://{{AFX_VIRTUAL(CimageData)public:virtual CString GetDefaultDBName();virtual CString GetDefaultSQL();virtual void DoFieldExchange(CDaoFieldExchange* pFX);file://}}AFX_VIRTUAL该类的实现为:CimageData:: CimageData (CDaoDatabase* pdb): CDaoRecordset(pdb){file://{{AFX_FIELD_INIT(CimageData)m_nFields = 1;//数据库的表中仅有一个字段file://}}AFX_FIELD_INITm_nDefaultType = dbOpenDynaset;//以动态集方式打开数据库}CString CimageData::GetDefaultDBName(){return _T("E:\\IMAGES.mdb");//默认的ACESS数据库在E盘,名为IMAGES}CString CimageData::GetDefaultSQL(){return _T("[Table]");//默认打开数据库中名为"Table"的表}void CimageData::DoFieldExchange(CDaoFieldExchange* pFX){file://{{AFX_FIELD_MAP(CimageData)pFX->SetFieldType(CDaoFieldExchange::outputColumn);DFX_Binary(pFX, _T("[Images]"), m_Images);//以二进制方式在Images字段和m_Images变量间交换数据file://}}AFX_FIELD_MAP}有了该类,就可以定义相应的对象来与数据库中的图像字段交换数据,下面定义的函数GetImageData()说明了如何根据读取的OLE字段数据生成待显示的图像,需要注意的是该函数中使用的CBitmap类的变量Bitmap是预定义的一个全局变量:BOOL CImageDlg:: GetImageData(CByteArray & DBArray){CByteArray Array;Array.Copy( DBArray);int HeaderLen = 78 + sizeof(BITMAPFILEHEADER); file://确定图像头信息的起始位置Array.RemoveAt( 0, HeaderLen ); // 移动到图像头信息的起始位置BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;file://得到图像数据的头信息int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;file://确定图像的颜色数LPVOID lpDIBBits;if( bmInfo.bmiHeader.biBitCount > 8 )lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));elselpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);file://得到图像各个像素的具体数据CClientDC dc(NULL);HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);file://生成位图句柄Bitmap.Attach( hBmp );//将该句柄与定义的Bitmap对象联系在一起Array.RemoveAll(); file://释放内存return TRUE;}有了上面的准备工作,现在可以实现图像的显示函数了,其实现如下:void CImageDlg::OnShowImage(){CimageData db;//定义记录集对象db.Open();打开数据库GetImageData(db.m_Images);//根据记录集对象的成员变量生成图像对象file://以下是在对话框的固定区域显示图像CPaintDC dc(this);if (!(Bitmap.m_hObject == NULL)){ CDC dcMem;dcMem.CreateCompatibleDC( &dc ); file://create a Memory ImageCBitmap* pbmpOld ;BITMAP BmpSize ;Bitmap.GetBitmap(&BmpSize); file://get Image SizepbmpOld = dcMem.SelectObject(&Bitmap);dc.StretchBlt( 20, 20, 200, 200, &dcMem, 0, 0, BmpSize.bmWidth, BmpSize.bmHeight, SRCCOPY); dcMem.SelectObject( pbmpOld );}以上代码中使用的数据库为ACESS97,程序在windows98、Visual C++6.0环境下编译通过,运行正常。
VC图像处理系列之二--图像显示篇
VC图像处理系列之二--图像显示篇
耿迅
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2005(000)010
【摘要】本文介绍了在Windows环境下图像显示的基本原理.使用VC实现了BMP图像的显示,并且讨论了类CBmp的设计思路.介绍了Win32环境下利用双缓存技术和VFW组件来提高图像显示性能的方法.
【总页数】5页(P12-16)
【作者】耿迅
【作者单位】无
【正文语种】中文
【中图分类】TP3
【相关文献】
1.VC图像处理系列之三--图像增强篇 [J], 耿迅
2.VC图像处理系列之四--傅立叶变换篇 [J], 耿迅
3.国际VC中国战略系列之二十四以色列VC试飞中匡 [J], 户才和
4.’94本刊记者专访系列篇之二:励志篇——挥舞魔杖的人——访浙江真空包装机总厂厂长金祥佐 [J], 晓刚
5.国际VC中国战略系列之二十二麦戈文:我为什么让IDGVC独立? [J], 户才和因版权原因,仅展示原文概要,查看原文内容请购买。
VC中用IPicture在窗口中显示图片文件
VC中⽤IPicture在窗⼝中显⽰图⽚⽂件VC 中⽤ IPicture 在窗⼝中显⽰图⽚⽂件2008-12-09 16:30:07阅读(232)评论(1)发表评论 想做个东西,⽤VC,希望是在程序界⾯上能把指定 URL 的图⽚显⽰出来,还没找到如何显⽰ HTTP 资源的图⽚,先还是让本地图⽚能在 VC 的窗⼝(包括各种控件)中显⽰出来吧。
在⽹上搜索了⼀番,⼤家代码都如出⼀辙,我也不能⽣搬硬载,不由⼜亲⼿实践了⼀下,并连同原来学过的 Window SDK 做窗⼝程序也复习了⼀遍,没有使⽤到 MFC,只需存成单个源⽂件,甚⾄⽤ CL 命令来编译都⽆须打开 VC 的,在 VC6 中测试通过。
效果图如下: 代码如下:(仅需关键最后⼀个⽅法 ShowPic(char *lpstrFile, HWND hWnd))#include <windows.h> // Windows SDK 要⽤到的 #include <commdlg.h> // 打开⽂件的窗⼝要包含这个头⽂件 //⽤到了 IPicture 接⼝,要包含下⾯两个头⽂件 #include <ocidl.h> #include <olectl.h> // 声明窗⼝函数的原型 LRESULT CALLBACK MainWndProc (HWND, UINT, WPARAM, LPARAM); // 声明显⽰图⽚的函数原型 HRESULT ShowPic(char*lpstrFile,HWND hWnd) ; //图⽚⽂件名 char lpstrFile[MAX_PATH]=""; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { // 窗⼝类名 char szClassName[ ] = "ShowPicture"; WNDCLASSEX windclass; //⽤描述主窗⼝的参数填充 WNDCLASSEX 结构 windclass.cbSize = sizeof(windclass); //结构⼤⼩ windclass.hInstance = hThisInstance; //实例句酚 windclass.lpszClassName = szClassName; windclass.lpfnWndProc = MainWndProc; //窗⼝函数指针 windclass.style = CS_DBLCLKS; //捕获双击事件 windclass.cbSize = sizeof(WNDCLASSEX); windclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //使⽤预定义图标 windclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //使⽤预定义类的⼩图标 windclass.hCursor = LoadCursor (NULL, IDC_ARROW); //使⽤预定义光标 windclass.lpszMenuName = NULL; //不指定主菜单 windclass.cbClsExtra = 0; //没有额外的类内存 windclass.cbWndExtra = 0; //没有额外的窗⼝内存 windclass.hbrBackground = (HBRUSH) COLOR_BACKGROUND; //使⽤预定义背景画刷 //注册这个窗⼝类,如果失败直接退出程序 if(!RegisterClassEx (&windclass)) return0; //创建主窗⼝ HWND hWnd = CreateWindowEx ( 0, //dwExStyle, 扩展样式 szClassName, //lpClassName, 类名 "显⽰图⽚ -- ⿏标双击浏览图⽚⽂件 -- Author:Unmi", //lpWindowName, 标题 WS_OVERLAPPEDWINDOW, //dwStyle, 窗⼝风格 CW_USEDEFAULT, //X, 初始 X 坐标 CW_USEDEFAULT, //Y, 初始 YX 坐标 640, //nWidth, 宽度 480, //nHeight, ⾼度 HWND_DESKTOP, //hWndParent, ⽗窗⼝句柄 NULL, //hMenu, 菜单句柄 hThisInstance, //hInstance, 程序实例句柄 NULL //lpParam, ⽤户数据 ); //显⽰窗⼝,刷新窗⼝客户区 ShowWindow (hWnd, nFunsterStil); // 从消息队列中取出消息,交给窗⼝函数处理 // 直到 GetMessage 取出的消息是 WM_QUIT,即FALSE,则结束消息循环 MSG messages; while(GetMessage (&messages, NULL, 0, 0)) { //转换键盘消息,把虚拟键转换为字符消息 TranslateMessage(&messages); //将消息发送到相应的窗⼝函数 DispatchMessage(&messages); } // GetMessage 返回 FALSE,程序结束 PostQuitMessage() 发出这⼀消息 return messages.wParam; } // 窗⼝函数,消息由 DispatchMessage 派发 LRESULT CALLBACK MainWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) //处理消息 { case WM_DESTROY: //向消息队列投递⼀个 WM_QUIT 消息,促使 GetMessage 函数返回0,结束消息循环 PostQuitMessage (0); break; case WM_LBUTTONDBLCLK: { OPENFILENAME file = {0}; file.lStructSize = sizeof(file); file.lpstrTitle = "请选择⼀个图⽚⽂件"; file.lpstrFile = lpstrFile; file.nMaxFile = MAX_PATH; file.lpstrFilter = "Pictures(*.jpg,*.gif,*.bmp)*.jpg;*.gif;*.bmp"; if(::GetOpenFileName(&file)) { //清除原来的图像 HDC hdc=GetDC(hWnd); RECT rect; ::GetWindowRect(hWnd,&rect); ::FillRect(hdc,&rect,(HBRUSH) COLOR_BACKGROUND); ::SendMessage(hWnd,WM_PAINT,NULL,NULL); } } break; case WM_PAINT: ShowPic(lpstrFile,hWnd); break; default: //将我们不处理的消息交给系统做默认处理 return DefWindowProc (hWnd, message, wParam, lParam); } return0; } // 显⽰图⽚,此⽂的重点之所在了, lpstrFile 为图⽚⽂件名,hWnd 为窗⼝句柄 HRESULT ShowPic(char*lpstrFile,HWND hWnd) { HDC hDC_Temp=GetDC(hWnd); IPicture *pPic; IStream *pStm; BOOL bResult; HANDLE hFile=NULL; DWORD dwFileSize,dwByteRead; //打开图形⽂件 hFile=CreateFile(lpstrFile,GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile!=INVALID_HANDLE_VALUE) { dwFileSize=GetFileSize(hFile,NULL);//获取⽂件字节数 if(dwFileSize==0xFFFFFFFF) return E_FAIL; } else { return E_FAIL; } //分配全局存储空间 HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); LPVOID pvData = NULL; if(hGlobal == NULL) return E_FAIL; if((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块 return E_FAIL; ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把⽂件读⼊内存缓冲区 GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); //装⼊图形⽂件 bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); if(FAILED(bResult)) return E_FAIL; OLE_XSIZE_HIMETRIC hmWidth; //图⽚的真实宽度, 单位为英⼨ OLE_YSIZE_HIMETRIC hmHeight; //图⽚的真实⾼度, 单位为英⼨ pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); //转换hmWidth和hmHeight为pixels距离,1英⼨=25.4毫⽶ int nWidth = MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540); int nHeight = MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540); //将图形输出到屏幕上(有点像BitBlt) bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight, 0,hmHeight,hmWidth,-hmHeight,NULL); pPic->Release(); CloseHandle(hFile);//关闭打开的⽂件 if(SUCCEEDED(bResult)) { return S_OK; } else { return E_FAIL; } } 函数 HRESULT ShowPic(char *lpstrFile,HWND hWnd) 是本⽇志要义之所在,传⼊⽂件名和窗⼝句柄(⽐如按或者静态⽂本框的句柄亦可),然后会在指定窗⼝中按图⽚实际尺⼨显⽰出来。
- 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.成果运行程序。