使用GDI在内存中转换图片类型

  • 来源: 互联网 作者: rocket   2008-03-18/11:57
  • 微软新推出的GDI+功能强大,本文仅对图片转换加以讨论,不足之处请大家指出.

      图片类型的转换支持:bmp、dib、png、gif、jpeg/jpg、tiff、emf等

      以下是详细步骤。

      首先在StdAfx.h中静态调用diplus.lib,即由编译系统完成对DLL的加载,应用程序结束时卸载DLL的编码。如下:






    #ifndef ULONG_PTR

    #define ULONG_PTR unsigned long*

    #include "GdiPlus.h"

    using namespace Gdiplus;

    #pragma comment(lib, "gdiplus.lib")

    #endif

     

     

      在类的头文件中定义,以下成员变量,用来初始化GDI+的使用和结束使用。


    GdiplusStartupInput m_gdiplusStartupInput;

           ULONG_PTR m_gdiplusToken;

     

     

      然后在OnCreate()函数中加入初始化GDI+的函数:


    GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);     

     

      在OnDestroy()函数中加入结束GDI+使用的函数:


     GdiplusShutdown(m_gdiplusToken);

     

     

      接着定义转换函数


    BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)

     

     

      其中:

      CMemFile& cbfBmp表示原位图文件;

      CMemFile& cbfImage表示转换后的图形文件;

      CString strType表示转换的图片类型。

      该函数中主要的处理为以下几步:

      1、将原位图文件转换为IStream;

      2、定义Image类实例,并使用第1步获得的IStream初始化;

      3、获取转换的图片类型的CLSID;

      4、将Image以转换的图片类型保存到IStream中;

      5、将IStream转换为CMemFile内存文件(也可为CFile)。

      详细代码如下:


    BOOL MBmpToMImage(CMemFile& cbfBmp, CMemFile& cbfImage, CString strType)

    {

           int iBmpSize = cbfBmp.GetLength();

           HGLOBAL hMemBmp = GlobalAlloc(GMEM_FIXED, iBmpSize);

           if (hMemBmp == NULL) return FALSE;

           IStream* pStmBmp = NULL;

           CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmBmp);

           if (pStmBmp == NULL)

           {

                  GlobalFree(hMemBmp);

                  return FALSE;

           }

           BYTE* pbyBmp = (BYTE *)GlobalLock(hMemBmp);

           cbfBmp.SeekToBegin();

           cbfBmp.Read(pbyBmp, iBmpSize);

           Image* imImage = NULL;

           imImage = Image::FromStream(pStmBmp, FALSE);

           if (imImage == NULL)

           {

                  GlobalUnlock(hMemBmp);



                  GlobalFree(hMemBmp);

                  return FALSE;

           }

           USES_CONVERSION;

           CLSID clImageClsid;

           GetImageCLSID(A2W("image/”+strType.GetBuffer(0)), &clImageClsid);

           HGLOBAL hMemImage = GlobalAlloc(GMEM_MOVEABLE, 0);

           if (hMemImage == NULL)

           {

                  pStmBmp->Release();

                  GlobalUnlock(hMemBmp);

                  GlobalFree(hMemBmp);

                  if (imImage != NULL) delete imImage;

                  return FALSE;

           }

           IStream* pStmImage = NULL;

           CreateStreamOnHGlobal(hMemImage, TRUE, &pStmImage);

           if (pStmImage == NULL)

           {

                  pStmBmp->Release();

                  GlobalUnlock(hMemBmp);

                  GlobalFree(hMemBmp);

                  GlobalFree(hMemImage);

                  if (imImage != NULL) delete imImage



                  return FALSE;

           }    

           imImage->Save(pStmImage, &clJpgClsid);

           if (pStmImage == NULL)

           {

                  pStmBmp->Release();

                  pStmImage>Release();

                  GlobalUnlock(hMemBmp);

                  GlobalFree(hMemBmp);

                  GlobalFree(hMemImage;

                  if (imImage != NULL) delete imImage;

                  return FALSE;

           }

           LARGE_INTEGER liBegin = {0};

           pStmImage->Seek(liBegin, STREAM_SEEK_SET, NULL);

           BYTE* pbyImage = (BYTE *)GlobalLock(hMemImage);

           cbfImage.SeekToBegin();

           cbfImage.Write(pbyImage, GlobalSize(hMemImage));

           if (imImage != NULL) delete imImage;

           pStmBmp->Release();

           pStmImage->Release();

           GlobalUnlock(hMemBmp);

           GlobalUnlock(hMemImage);

           GlobalFree(hMemBmp);

           GlobalFree(hMemImage);

           return TRUE;

    }


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多