在 VC++6.0 中将 JPG 格式图片转换成 BMP 格式
思路:利用 GDI+来完成
难点: (1)配置 GDI 开发环境,添加配置代码
(2)在当文档程序中添加转换代码
注意:本文档由 ybdesire 参考网上资料撰写完成,代码已经做过测试,可直接复制张贴
实现过程:
一、 配置 GDI 开发环境
(1) 下载 GDI+ SDK for Visual C++ 6.0
http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
下载的GDIPlus文件夹中有Includes,Lib文件夹和gdiplus.dll文件。
将Includes和Lib中的文件分别拷到VC6安装目录中的VC98\include和lib文件夹下。
(2) 新建 MFC 单文档应用程序 show:
- #include <afxdtctl.h>
- #define ULONG_PTR ULONG
- #include <gdiplus.h>
- using namespace Gdiplus;
- #pragma comment(lib, "gdiplus.lib")
2、如(1)中所说,将gdiplus.dll拷贝到本工程的Debug或Release目录下
3、在show.h中的class CShowApp : public CWinApp中添加
- private:
- GdiplusStartupInput m_gdiplusStartupInput;
- ULONG_PTR m_pGdiToken;
4、在show.cpp中的BOOL CShowApp::InitInstance()中添加
- GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
5、 CShowApp添加名字为ExitInstance的虚函数的,中添加如下退出GDI+的代码
- GdiplusShutdown(m_pGdiToken);
(3) 测试 GDI+是否配置成功
- void CShowView::OnDraw(CDC* pDC)
- {
- CShowDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- Graphics graphics(pDC->m_hDC);
- Pen pen(Color(255, 0, 255));
- graphics.DrawLine(&pen, 0, 0, 200, 100);
- }
若能成功运行,表明GDI+配置成功
二、 添加转换代码,实现将打开的 JPG 格式文件保存成 BMP 格式文件
(1)在 CSshowView 中添加如下成员变量
- CString strOpenFileName;
(2)在 CSshowView 中添加如下成员函数
1、在 CSshowView 中添加 ToWChar 函数
- WCHAR* CShowView::ToWChar(char *str)
- {
- //在 GDI+中,有关字符的参数类型全部都是 WCHAR 类型的
- //该函数是将传统字符串进行转换
- static WCHAR buffer[1024];
- wcsset(buffer,0);
- MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
- return buffer;
- }
2、在 CSshowView 中添加 GetImageCLSID 函数
- int CShowView::GetImageCLSID(const WCHAR *format, CLSID *pCLSID)
- {
- UINT num=0;
- UINT size=0;
- ImageCodecInfo* pImageCodecInfo=NULL;
- GetImageEncodersSize(&num,&size);
- if(size==0)
- return FALSE; // 编码信息不可用
- // 分配内存
- pImageCodecInfo=(ImageCodecInfo*)(malloc(size));
- if(pImageCodecInfo==NULL)
- return FALSE; // 分配失败
- // 获得系统中可用的编码方式的所有信息
- GetImageEncoders(num,size,pImageCodecInfo);
- // 在可用编码信息中查找 format 格式是否被支持
- for(UINT i=0;i<num;++i)
- {
- //MimeType: 编码方式的具体描述
- if (wcscmp(pImageCodecInfo[ i] .MimeType,format)==0)
- {
- *pCLSID=pImageCodecInfo[i].Clsid;
- free(pImageCodecInfo);
- return TRUE;
- }
- }
- free(pImageCodecInfo);
- return FALSE;
- }
3、在 MFC ClassWixard 中重载 OnFileOpen()
- void CShowView::OnFileOpen()
- {
- static char szFilter[ ]="常见图像格式文件(*.*)|*.*|";
- CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
- if(dlgChoseImage.DoModal() ==IDOK)
- {
- strOpenFileName=dlgChoseImage.GetPathName();
- // 打开文件后立即在窗口中显示 (重绘客户窗口)
- this->Invalidate() ;
- }
- }
4、在 MFC ClassWixard 中重载 OnFileSave()
- void CShowView::OnFileSave()
- {
- if( strOpenFileName.IsEmpty() )
- {
- AfxMessageBox("当前没有打开图像文件, 不能进行保存!");
- return;
- }
- // 建立图形对象