用GDI+实现BMP和JPG的相互转换 (2015/11/26)
一.配置GDI+
1. 下载GdiPlus http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip
2. 解压到指定目录(我直接解压到C盘根目录下)
3. 设置包含文件路径,(Tool->Option)分别设置include files和library files
4. 把gdiplus.dll拷贝到工程目录(拷贝前,先建工程)
二.建立工程
1. 新建show单文档工程
2. 在StdAfx.h中添加如下代码
#include <afxcmn.h> // MFC support for Windows Common Controls
#define ULONG_PTR ULONG
#include<gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")
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的虚函数,并在ExitInstance中添加GDI+退出代码
GdiplusShutdown(m_pGdiToken);
6. 测试GDI+是否配置成功
// CShowView drawing
void CShowView::OnDraw(CDC* pDC)
{
CShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
Graphics graphics(pDC->m_hDC);
Pen pen(Color(255,0,0));
graphics.DrawLine(&pen,0,0,200,200);
Invalidate();
}
若能看到一条红线,表明GDI+配置成功
三.
1.为CShowView中添加如下成员函数
WCHAR* CShowView::ToWChar(char *str)
{
static WCHAR buffer[1024];
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
2.添加成员函数
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);
for (UINT i=0; i<num; ++i)
{
if(wcscmp(pImageCodecInfo[i].MimeType,format) == 0)
{
*pCLSID = pImageCodecInfo[i].Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
3.添加JPG转换为bmp代码
void CShowView::OnJpgToBmp()
{
// TODO: Add your command handler code here
Graphics graphics(GetDC()->m_hDC);
Image image(L"aaa.jpg");
CLSID clsid;
if (GetImageCLSID(L"image/bmp",&clsid))
{
image.Save(L"bbb.bmp",&clsid,NULL);
}
}
4.添加bmp转jpeg的代码
void CShowView::OnBmpToJpg()
{
// TODO: Add your command handler code here
Graphics graphics(GetDC()->m_hDC);
Image image(L"bbb.bmp");
CLSID clsid;
if (GetImageCLSID(L"image/jpeg",&clsid))
{
image.Save(L"ccc.jpg",&clsid,NULL);
}
}
附件: 无
|