利用GDI+实现BMP、JPEG、GIF图像格式的转换

Visual C++6.0中,实现各种类型的类型的图像转换是比较复杂的,有时还需要用户了解图像的各种格式,以及图像的编码、解码算法。使用GDI+,用户则可以非常方便地实现图像类型的转换。下面就编写一个实例实现BMPJPEGGIF图像格式的相互转换。

VS中使用GDI+需注意的问题:

1.下载GDI+包文件

2.引用Gdiplus.h头文件

3.引用Gdiplus命名空间

1)创建一个基于对话框的工程,命名为ConvertImage,设计对话框资源如图1-1所示。

利用GDI+实现BMP、JPEG、GIF图像格式的转换_第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所示

利用GDI+实现BMP、JPEG、GIF图像格式的转换_第2张图片

图10-1图像格式转换

(待完善)

你可能感兴趣的:(利用GDI+实现BMP、JPEG、GIF图像格式的转换)