程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Image類的序列化

Image類的序列化

編輯:關於VC++

利用GDI+圖形設備接口提供的Image類我們可以很方便地顯示JPEG、GIF等文件格式的圖片,但美中不足的是Image類未提供序列化數據的功能,如果要將從JPEG、GIF等格式的文件中讀取的圖片數據保存到我們自己開發的應用程序文檔中,並能從文檔中讀取已經保存的圖片數據並正確的顯示出來,就必須實現Image類數據的序列化。 假如在你的文檔類中有個指向Image類的成員指針變量m_pImage用於顯示圖片,那麼在文檔類的序列化函數Serialize(CArchive& ar)中加入以下的代碼就能實現m_pImage所指向的圖片數據的序列化: if (ar.IsStoring())
{
  HGLOBAL m_hMem = GlobalAlloc(GMEM_MOVEABLE, 0);
  IStream *pstm=NULL;
  CreateStreamOnHGlobal(m_hMem, TRUE, &pstm);
  CLSID clsid;
  USES_CONVERSION;
  GetCodecClsid(A2W("image/bmp"), &clsid);
  m_pImage->Save(pstm,&clsid,NULL);
  if (pstm==NULL)
    return;
  LARGE_INTEGER liBeggining = { 0 };
  pstm->Seek(liBeggining, STREAM_SEEK_SET, NULL);
  DWORD wTemp=GlobalSize(m_hMem);
  LPBYTE lpData = (LPBYTE)GlobalLock(m_hMem);
  ar << wTemp;
    ar.Write(lpData,wTemp);
  pstm->Release();
  GlobalUnlock(m_hMem);
}
else
{
  DWORD wTemp;
    ar >> wTemp;
  HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, wTemp);
  if (m_hMem == NULL)
    return;
  IStream *pstm=NULL;
  CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
  if (pstm==NULL)
    return;
  BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
  ar.Read(pmem,wTemp);
  if (m_pImage) {
      delete m_pImage;
      m_pImage = NULL;
    }
  using namespace Gdiplus;
  m_pImage = Image::FromStream(pstm, FALSE);
  pstm->Release();
  GlobalUnlock(m_hMem);
  //注意此處不能加GlobalFree(m_hMem);否則圖片顯示不出來。
其中函數GetCodecClsid的實現代碼如下:int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
  UINT num = 0;     // number of image encoders
  UINT size = 0;     // size of the image encoder array in bytes
  using namespace Gdiplus;
  ImageCodecInfo* pImageCodecInfo = NULL;
  GetImageEncodersSize(&num, &size);
  if(size == 0)
   return -1; // Failure
  pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  if(pImageCodecInfo == NULL)
   return -1; // Failure
  GetImageEncoders(num, size, pImageCodecInfo);
  for(UINT j = 0; j < num; ++j)
  {
   if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
   {
     *pClsid = pImageCodecInfo[j].Clsid;
     return j; // Success
   }  
  } // for
  return -1; // Failure
} // GetCodecClsid
形參format用以說明圖片數據的保存格式,可以取以下一些值:"image/bmp"(位圖格式),"image/jpeg"(JPEG格式),"image/gif"(GIF格式)等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved