| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 视频教程 | 素材下载 | 程序代码下载 | JS代码 | 论坛 | 
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
VC实现多格式图像的转换

作者:未知    文章来源:网络    点击数:    更新时间:2007-7-6
 



实现多格式的图像浏览和转换 

有了前面的知识,实现多格式的图像的浏览与转换就不是什么难事了。 

1.在VC中创建一个SDI项目ImageShow,对GDI+声明和初始化及销毁进行代码编制,具体代码如下: 

#include “Gdiplus.h” 

using namespace Gdiplus; 

CImageShowView::CImageShowView() 



//初始化GDI+ 

GdiplusStartupInput gdiplusStartupInput; 

ULONG_PTR gdiplusToken; 

GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 



CImageShowView::~CImageShowView() 



//销毁GDI+ 

ULONG_PTR gdiplusToken; 

GdiplusShutdown(gdiplusToken); 



2. 通过类向导(Class Wizard),重载“文件”菜单中的“打开”和“另存为”两项。为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存为其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件时进行文件名的传递,还应在CImageShowView类中加入一全局变量“CString strOpenFileName”。“打开”和“另存为”两菜单的对应代码如下: 

WCHAR* ToWChar(char * str) 



//在GDI+中,有关字符的参数类型全部都是WCHAR类型 

//该函数是将传统字符串进行转换 

static WCHAR buffer[1024]; 

wcsset(buffer,0); 

MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024); 

return buffer; 



void CImageShowView::OnFileOpen() 



//本程序能够打开各类常见格式的图像文件 static char szFilter[]=“常见格式图像文件(*.*)|*.*|”; 

CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter); 

if(dlgChoseImage.DoModal()==IDOK) 



strOpenFileName=dlgChoseImage 

.GetPathName(); 

//打开文件后立即在窗口中显示(重绘客户窗口) 

this->Invalidate(); 





void CImageShowView::OnFileSaveAs() 



if(strOpenFileName.IsEmpty()) 



AfxMessageBox(“当前没有打开图像文件,不能进行保存!”); 

return; 



//建立图形对象 

Graphics graphics(GetDC()->m_hDC); 

//装入当前已经打开的图像文件 

Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 

CString strFileSave; 

//将其他格式的图像全部另存为BMP文件 

static char szFilter[]=“位图(*.BMP)|*.BMP|”; 

CFileDialog dlgChoseImage(0,“BMP”,NULL,NULL,szFilter); 

if(dlgChoseImage.DoModal()==IDOK) 



strFileSave=dlgChoseImage.GetPathName(); 

CLSID clsid; 

if(GetImageCLSID(L“image/bmp”,&clsid)) 



image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL); 

//将保存后的图像进行显示 

strOpenFileName=strFileSave; 

this->Invalidate(); 







3.为了浏览图像转换前后的效果,还应该在窗口中分别绘制转换前后的图像,这需要在OnDraw函数中添加绘制代码,如下所示: 

void CImageShowView::OnDraw(CDC* pDC) 



CImageShowDoc* pDoc = GetDocument(); 

ASSERT_VALID(pDoc); 

//如果没有选择显示图像文件,则不用重绘 

if(strOpenFileName.IsEmpty()) 

return; 

//显示当前打开的图像文件的全名 

this->GetParent()->SetWindowText(strOpenFileName); 

//建立图像对象 

Graphics graphics(pDC->m_hDC); 

//装入图形文件 

Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength()))); 

Point destPoints[3] = 



Point(0, 0), 

Point(image.GetWidth(), 0), 

Point(0, image.GetHeight()) 

}; 

Point* pdestPoints = destPoints; 

//在指定区域pdestPoints显示图像 

graphics.DrawImage(&image, pdestPoints, 3); 



在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK 2001”编译错误。上述程序在Visual Studio 6.0、Windows 2000/XP下调试通过,它能够显示或转换的图像格式有BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF、EMF等等。需要说明的是,本文只就GDI+编程的基本原理进行了阐述,事实上,GDI+的应用远不止此。 

结束语 

如果对本程序进行些改进,还可以编制出功能更加强大的图像处理程序。本文中所提到的程序,在笔者的主页“国税之家”(http://nationaltax.home.chinaren.com)的“个人世界”中可以下载到。有关GDI+编程的帮助信息,大家可以到微软的MSDN网站去查阅。

上一页  [1] [2] 


  • 上一篇文章:

  • 下一篇文章: 没有了
  • 相关文章