目前位置: VCer资源中心 >>> VCer代码 >>> 图形图象处理

[本帖已阅读1078次 分值80 回复0次] 张贴资源 发回信箱 控制面板

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

提供者:qiaoyongbo 张贴时间:2007-07-20 10:31:18.0 出处:http://www.pcbcw.com 作者:不祥

用GDI+在内存中转换图片类型(2007-07-20 10:31:18.0)


qiaoyongbo


 
级别: VCer排长
头衔: VCer会员

经验: 1728
作品: 24
分会: 华北分会
注册: 2007-07-20 01:16:17.0
登录: 2008-06-26 17:46:39.0

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

}

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1184898678484.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 0% (0 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)