AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

VC实现多格式图像的转换

51自学网 2015-08-30 http://www.wanshiok.com

 

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网站去查阅。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC++中的数据类型  下一篇:在Unix下用C编写类Windows菜单