科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC中使用GDI+在内存转换图片类型

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

微软新推出的GDI+功能强大,本文仅对图片转换加以讨论,不足之处请大家指出。

作者:petery编译 来源:天极网 2007年10月19日

关键字: VC GDI+ 转换 图片类型

  • 评论
  • 分享微博
  • 分享邮件
微软新推出的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;
}

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章