使用IStream和GDI+在記憶體中實現映像格式轉換

來源:互聯網
上載者:User

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

IStream是COM中的介面,真是搞不懂這樣也可以~~~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.