在VC中使用GDIPlus

首先,在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;

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

GdiplusStartup(&m_gdiplusToken, &m_gdiplusStartupInput, NULL);

在ExitInstance()函数中加入结束GDI+使用的函数: GdiplusShutdown(m_gdiplusToken);

 

需要画的时候

Graphics graphics(GetDC()->m_hDC);
 Image image(L"Mega_GamesPack_001.png", FALSE);
 graphics.DrawImage(&image, 10,10,image.GetWidth(),image.GetWidth());

 

2276569611636351920.jpg

 

使用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表示转换的图片类型。  
   
  该函数中主要的处理为以下几步:  
  将原位图文件转换为IStream    
  定义Image类实例,并使用第1步获得的IStream初始化    
  获取转换的图片类型的CLSID    
  将Image以转换的图片类型保存到IStream中    
  将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;  
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值