远景视讯

 
 


用GDI+实现BMP和JPG的相互转换
(2015/11/26)



一.配置GDI+

1.       下载GdiPlus http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip

2.       解压到指定目录(我直接解压到C盘根目录下)

3.       设置包含文件路径,(Tool->Option)分别设置include fileslibrary 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.hclass 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.添加bmpjpeg的代码

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);

    }

}

附件: 无  

© 2013 版权所有 鄂ICP备10021900号-1
远达锐捷电子