使用CImage类处理图像显示与格式转换(转)
2010-06-22 14:11
609 查看
Introduction
CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。
Background
我们知道,Visual 的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源总的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP,GIF, JPEG等)。因此,要想在对话框或者其它窗口中显示外部图像文件则只能借助于第三方提供的控件或者代码。现在,MFC和ATL共享的新类CImage为图象处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。
Using the code
使用CImage的一般方法是这样的过程:
(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:
#include <atlimage.h>
(2)定义CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。
(3)调用CImage::Draw方法绘制图像。
例如在单文档程序中显示图像文件的例子:
void CEx_ImageView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
CString strFilter;
CSimpleArray aguidFileTypes;
HRESULT hResult;
hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T("All Image Files"));
if (FAILED(hResult)) {
MessageBox("GetExporterFilter调用失败!");
return;
}
CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter);
if (IDOK != dlg.DoModal()) {
return;
}
m_Image.Destroy();
hResult = m_Image.Load(dlg.GetFileName());
if (FAILED(hResult)) {
MessageBox("调用图像文件失败!");
return;
}
CString str;
str.LoadString(AFX_IDS_APP_TITLE);
AfxGetMainWnd()->SetWindowText(str+"-"+dlg.GetFileName());
Invalidate();
}
将图片用其他格式保存:
void CEx_ImageView::OnFileSaveAs()
{
if(m_Image.IsNull()){
MessageBox("您还没有打开一个要保存的图像文件!");
return;
}
CString strFilter;
strFilter = "位图文件|*.bmp|JPEG图像文件|*.jpg|GIF图像文件|*.gif|PNG图像文件|*.png||";
CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
if (IDOK!=dlg.DoModal()) {
return;
}
// 如果用户没有制定文件扩展民,则为其添加一个
CString strFileName;
CString strExtension;
strFileName = dlg.m_ofn.lpstrFile;
if (dlg.m_ofn.nFileExtension == 0) {
switch(dlg.m_ofn.nFilterIndex)
{
case 1:
strExtension = "bmp"; break;
case 2:
strExtension = "jpg"; break;
case 3:
strExtension = "gif"; break;
case 4:
strExtension = "png"; break;
default:
break;
}
strFileName = strFileName + ’.’+strExtension;
}
// 保存图像
HRESULT hResult = m_Image.Save(strFileName);
if (FAILED(hResult)) {
MessageBox("保存图像文件失败!");
}
}
CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以相互转换。
Background
我们知道,Visual 的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源总的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP,GIF, JPEG等)。因此,要想在对话框或者其它窗口中显示外部图像文件则只能借助于第三方提供的控件或者代码。现在,MFC和ATL共享的新类CImage为图象处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。
Using the code
使用CImage的一般方法是这样的过程:
(1) 打开应用程序的stdafx.h文件添加CImage类的包含文件:
#include <atlimage.h>
(2)定义CImage类对象,然后调用CImage::Load方法装载一个外部图像文件。
(3)调用CImage::Draw方法绘制图像。
例如在单文档程序中显示图像文件的例子:
void CEx_ImageView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
CString strFilter;
CSimpleArray aguidFileTypes;
HRESULT hResult;
hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T("All Image Files"));
if (FAILED(hResult)) {
MessageBox("GetExporterFilter调用失败!");
return;
}
CFileDialog dlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,strFilter);
if (IDOK != dlg.DoModal()) {
return;
}
m_Image.Destroy();
hResult = m_Image.Load(dlg.GetFileName());
if (FAILED(hResult)) {
MessageBox("调用图像文件失败!");
return;
}
CString str;
str.LoadString(AFX_IDS_APP_TITLE);
AfxGetMainWnd()->SetWindowText(str+"-"+dlg.GetFileName());
Invalidate();
}
将图片用其他格式保存:
void CEx_ImageView::OnFileSaveAs()
{
if(m_Image.IsNull()){
MessageBox("您还没有打开一个要保存的图像文件!");
return;
}
CString strFilter;
strFilter = "位图文件|*.bmp|JPEG图像文件|*.jpg|GIF图像文件|*.gif|PNG图像文件|*.png||";
CFileDialog dlg(FALSE,NULL,NULL,NULL,strFilter);
if (IDOK!=dlg.DoModal()) {
return;
}
// 如果用户没有制定文件扩展民,则为其添加一个
CString strFileName;
CString strExtension;
strFileName = dlg.m_ofn.lpstrFile;
if (dlg.m_ofn.nFileExtension == 0) {
switch(dlg.m_ofn.nFilterIndex)
{
case 1:
strExtension = "bmp"; break;
case 2:
strExtension = "jpg"; break;
case 3:
strExtension = "gif"; break;
case 4:
strExtension = "png"; break;
default:
break;
}
strFileName = strFileName + ’.’+strExtension;
}
// 保存图像
HRESULT hResult = m_Image.Save(strFileName);
if (FAILED(hResult)) {
MessageBox("保存图像文件失败!");
}
}
相关文章推荐
- 数字图像处理 CImage类的使用与封装(jpg png gif tif bmp等格式图像的加载、数据读写、保存等功能)
- 170day(读书《Core Java》 7.5-7.8,(处理2D图形,使用颜色,文本特殊字体,显示图像))
- MFC中使用openCV显示、处理图像
- 使用QT实现一个图像处理软件1 —— 图片的加载和显示
- 处理2D图像和纹理——使用SpriteBatch类显示2D图像:加载和绘制图像
- MFC中使用openCV显示、处理图像
- MFC—PictureControl控件使用,显示和处理图像
- android 使用NDK进行图像处理(openCV)时的图像转换问题(灰度图显示)
- 使用CImage进行图像处理
- VS2012中MFC使用Picture Control显示OpenCV处理的图像
- Javascript图像处理―虚拟边缘介绍及使用方法
- 【数字图像处理】使用kmeans算法对TrueColor图片进行优化
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- Android图片处理:识别图像方向并显示
- Python 之 使用 PIL 库做图像处理
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- 使用MATLAB处理Dicom格式的图像
- imagxpress图像处理控件使用手册
- 使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)