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

转载 2008年04月27日 16:55:00
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

使用GDI+内存中转换图片类型<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

作者:卢伟

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

图片类型的转换支持:bmpdibpnggifjpeg/jpgtiffemf

以下是详细步骤。

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

}

<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 728x15, 创建于 08-4-23MSDN */ google_ad_slot = "3624277373"; google_ad_width = 728; google_ad_height = 15; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"><!-- google_ad_client = "pub-2947489232296736"; /* 160x600, 创建于 08-4-23MSDN */ google_ad_slot = "4367022601"; google_ad_width = 160; google_ad_height = 600; //--> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

GDI+ 在窗口显示内存图片

bool CTest::ShowImage(CWnd *pWnd, PBYTE pbImgData, int iImgDataLen) { if (pWnd == NULL || pbIm...
  • friendan
  • friendan
  • 2014-12-26 13:58:47
  • 2419

GDI+屏幕截图内存BMP转JPG,JPG再转IStream流,IStream流再转BYTE;

今天有点突破了
  • Evankaka
  • Evankaka
  • 2014-06-04 23:22:51
  • 3604

gdi+内存绘图

#include "gdi.h"//自己封装的GDI+库 ::Graphics::TBitmap * bmp1; __fastcall TForm1::TForm1(TComponent* Owner...
  • chinayu2007
  • chinayu2007
  • 2015-05-17 21:26:38
  • 1007

GDI+中使用Image从IStream创建图像

   首先:创建内存文件,并将数据放入       BYTE* lpDataImg=new BYTE[length];       memcpy(lpDataImg,lpData,length);  ...
  • miranda2002
  • miranda2002
  • 2007-05-19 11:02:00
  • 2684

VB6结合GDI+实现内存(Stream)压缩/解压缩JPG(JPEG)图像

CSDN论坛vb版中有一个讨论内存压缩JPEG的帖子,在此我贴出解决代码。代码原理原本就简单,所以注释也很简单。希望能帮助到苦苦思索的朋友们。(魏滔序原创,转帖请注明出处。) 首先要下载一个IStre...
  • Modest
  • Modest
  • 2009-08-31 22:58:00
  • 14041

GDI+在内存中绘制,并保存为BMP、PNG、JPEG格式的图片关键代码

  • 2011年12月16日 08:27
  • 388KB
  • 下载

使用GDI+进行图片格式转换

  • 2013年09月07日 12:00
  • 431KB
  • 下载

3. GDI+ Bitmap和GDI HBITMAP互转

本文详细的讲解了带透明度的HBITMAP和Bitmap的转换,解决常见的Bitmap转HBITMAP背景变浅,HBITMAP转Bitmap背景变黑的问题,并演示了如何输出HBITMAP和Bitmap的...
  • wenzhou1219
  • wenzhou1219
  • 2017-10-21 15:05:35
  • 1206

GDI+在内存中绘图

为了防止画图闪烁,一般先将图像画
  • chinayu2007
  • chinayu2007
  • 2014-11-06 09:00:01
  • 939

使用GDI+进行图片处理时要注意的问题

使用GDI+进行图片处理时要注意的问题
  • chenlycly
  • chenlycly
  • 2014-04-19 15:37:50
  • 11923
收藏助手
不良信息举报
您举报文章:使用GDI+在内存中转换图片类型
举报原因:
原因补充:

(最多只允许输入30个字)