在Visual C++6.0中,实现各种类型的类型的图像转换是比较复杂的,有时还需要用户了解图像的各种格式,以及图像的编码、解码算法。使用GDI+,用户则可以非常方便地实现图像类型的转换。下面就编写一个实例实现BMP、JPEG、GIF图像格式的相互转换。
在VS中使用GDI+需注意的问题:
1.下载GDI+包文件
2.引用Gdiplus.h头文件
3.引用Gdiplus命名空间
(1)创建一个基于对话框的工程,命名为ConvertImage,设计对话框资源如图1-1所示。
图1-1对话框资源设计窗口
(2)在stdafx.h 头文件中 引用Gdiplus的头文件和命名空间,,代码如下:
//引用Gdiplus 的头文件和命名空间
#include "Gdiplus//Includes//GdiPlus.h" //引用头文件根据实际情况设定路径
using namespace Gdiplus;//引用命名空间
#pragma comment(lib,"Gdiplus//Lib//GdiPlus.lib")//lianjie Gdiplus.lib wenjian
(3)向对话框类中添加成员变量,代码如下:
private: GdiplusStartupInput m_Gdiplus;//定义初始变量 ULONG_PTR m_pGdiToken;//定义GDI符号 CString m_FileName;//记录文件名称
(4)在对话框初始化时初始化GDI+,并设置按钮状态,代码如下:
GdiplusStartup(&m_pGdiToken,&m_Gdiplus,NULL); CButton* pButton=NULL; pButton = (CButton*)GetDlgItem(IDC_JPEG);//获取按钮对象 if(pButton != NULL) { pButton->SetCheck(BST_CHECKED);//选中按钮 }
(5)向对话框中添加OnCancel方法,在对话框关闭时卸载GDI+。代码如下:
void CConvertImageDlg::OnCancel() { GdiplusShutdown(m_pGdiToken);//释放GDI+ OnCancel(); }
(6)向对话框中添加GetCodecClisid方法,根据图像格式获取其CLSID。代码如下:
int GetCodecClsid(const WCHAR* format,CLSID* pClsid) { UINT num = 0;//记录图像编码的数量 UINT size = 0;//记录编码数组的大小 ImageCodecInfo* pImageCodecInfo = NULL;//定义图像编码信息 GetImageEncodersSize(&num,&size);//获取图像编码的数量和编码数组的大小 if (size == 0) { return -1; } pImageCodeInfo = (ImageCodecInfo*)(malloc(size)); if (pImageCodecInfo == NULL) { return -1; } GetImageEncoders(num,size,pImageCodecInfo); //获取图像编码 for (UINT j=0;j<num;++j) //获取匹配图像格式 { //比较字符串 if (wcscmp(pImageCodecInfo[j].MimeType,format)==0) { *pClsid = pImageCodecInfo[j].Clsid;//获取图像格式的CLSID return j; } } return -1; }
(7)处理“。。。”按钮的单击事件,选择待转换的图像,代码如下:
void CCnvertImageDlg::OnOK() { //定义一个文件打开对话框 CFileDialog flDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"图像文件|*.bmp;*.jpeg;*.jpg;*.gif|所有文件|*.*||",this); if (flDlg.DoModal() == IDOK)//用户单击确定按钮 { m_FileName = flDlg.GetPathName();//获取文件名及路径 m_ImageName.SetWindowText(m_FileName);//设置编辑框文本 } } (8)向对话框类中添加TestButtonState方法,根据按钮的命令ID判断按钮是否被选中,代码如下: BOOL CCnvertImageDlg::TestButtonState(UINT BTNID) { CButton *pButton = NULL;//定义按钮指针 pButton =(CButton*)GetDlgItem(BTNID);//获取按钮对象 if (pButton !=NULL) { if (pButton->GetCheck() == BST_CHECKED) { return TRUE; } } return false; }
(9)处理“转换”按钮单击事件,将源图像转换为指定的图像格式。代码如下:
void CCnvertImageDlg::OnConvert(UINT BTNID) { if (TestButtonState(IDC_IPEG))//判断JPEG单选按钮是否被选中 { CFileDialog flDlg(FALSE,_T("jpeg"),_T("convert"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("所有文件|*.*||"),this); if (flDlg.DoModal() == IDOK)//用户单击确定按钮 { CString svname=flDlg.GetPathName();//获取文件名及路径 Bitmap bmp(m_FileName.AllocSysString());//定义一个位图对象 CLSID clsid;//定义一个CLSID GetCodecClsid(L"image/jepg",&clsid);//保存JPEG图像的CLSID bmp.Save(svname.AllocSysString(),&clsid);//保存为JPEG格式 } } else if (TestButtonState(IDC_BMP))//判断BMP单选按钮是否被选中 { CFileDialog flDlg(FALSE,_T("bmp"),_T("convert"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("所有文件|*.*||"),this); if (flDlg.DoModal() == IDOK)//用户单击确定按钮 { CString svname=flDlg.GetPathName();//获取文件名及路径 Bitmap bmp(m_FileName.AllocSysString());//定义一个位图对象 CLSID clsid;//定义一个CLSID GetCodecClsid(L"image/jepg",&clsid);//保存GIF图像的CLSID bmp.Save(svname.AllocSysString(),&clsid);//保存为BMP格式 } } else { CFileDialog flDlg(FALSE,_T("gif"),_T("convert"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("所有文件|*.*||"),this); if (flDlg.DoModal() == IDOK)//用户单击确定按钮 { CString svname=flDlg.GetPathName();//获取文件名及路径 Bitmap bmp(m_FileName.AllocSysString());//定义一个位图对象 CLSID clsid;//定义一个CLSID GetCodecClsid(L"image/jepg",&clsid);//保存GIF图像的CLSID bmp.Save(svname.AllocSysString(),&clsid);//保存为GIF图像格式 } } }
(10)运行程序,结果如图10-1所示
图10-1图像格式转换