IPicture使用總結

來源:互聯網
上載者:User

1、IPicture介面對象的建立

         方法1:直接通過檔案建立

LPCSTR szFileUrl;

 IPicture *pIPicture;

 OleLoadPicturePath(CComBSTR(szFileUrl), 

   (LPUNKNOWN)NULL, 

   0, 

   0, 

   IID_IPicture,

   (LPVOID*)&pIPicture))

        方法2:通過IStream來建立

 // 載入電子地圖

 LPCSTR szFileUrl;

 IStream *pStream = NULL;

 IPicture *pIPicture = NULL;;

 CFileStatus fstatus;

 CFile file;

 LONG lFileSize;

 HGLOBAL hGlobal;

 if(file.Open(szFileUrl, CFile::modeRead) && file.GetStatus(szFileUrl, fstatus) 

  && ((lFileSize = fstatus.m_size) != -1))

 {

  hGlobal = GlobalAlloc(GMEM_MOVEABLE, lFileSize);// 開闢大記憶體

  if(hGlobal != NULL)

  {

   LPVOID pvData = NULL;

   pvData = GlobalLock(hGlobal);

   if(pvData != NULL)

   { 

    file.ReadHuge(pvData, lFileSize);   // 將圖片資料儲存在記憶體中

    GlobalUnlock(hGlobal);

    CreateStreamOnHGlobal(hGlobal, TRUE, &m_pIStream);  // 建立流

    file.Close();

   }

   else

   {

    GlobalFree(hGlobal);

    return;

   }

  }

  else

  {

   file.Close();

   return;

  }

 }

 else

 {

  //開啟圖片失敗

  return;

 }

 OleLoadPicture(m_pIStream, fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&m_pIPicture);

 GlobalFree(hGlobal);

2、通過IPicture來擷取圖片的尺寸

 OLE_XSIZE_HIMETRIC hmPicWidth;       

 OLE_YSIZE_HIMETRIC hmPicHeight;      

 pIPicture->get_Width(&hmPicWidth);   // 擷取映像寬度

 pIPicture->get_Height(&hmPicHeight); // 擷取映像高度

 // 轉化單位為象素

 nPicWidth = MulDiv(hmPicWidth, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSX), HIMETRIC_PER_INCH);

 nPicHeight = MulDiv(hmPicHeight, GetDeviceCaps(GetDC()->m_hDC, LOGPIXELSY), HIMETRIC_PER_INCH);



3、通過IPicture來畫圖

void ShowPicture(CDC *pDC)

{

 OLE_XPOS_HIMETRIC xSrc;  // 圖片中當前顯示地區的x

 OLE_YPOS_HIMETRIC ySrc;  // 圖片中當前顯示地區的y

 OLE_XSIZE_HIMETRIC cxSrc; // 圖片中當前顯示地區的寬度

 OLE_YSIZE_HIMETRIC cySrc; // 圖片中當前顯示地區的高度

 m_pIPicture->Render(*pDC, 0, 0, m_rcBox.Width(), m_rcBox.Height(), xSrc, ySrc, cxSrc, cySrc, NULL);

}



4、將IPicture中的圖片儲存起來

BOOL SaveToFileFromIPicture(LPCSTR szFileName, IPicture *pPic)

{

 // Create ILockBytes Buffer

 ILockBytes *plkbyt = NULL;

 CreateILockBytesOnHGlobal(NULL, TRUE, &plkbyt);

 // Create IStorage

 IStorage   *pStorage = NULL;

 HRESULT hr = ::StgCreateDocfileOnILockBytes(plkbyt,

  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStorage);

 if (FAILED(hr))

 {

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 // Create IStream

 IStream    *pStream = NULL;

 hr = pStorage->CreateStream(L"PICTURE",

  STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream);

 if (FAILED(hr))

 {

  pStorage->Release();

  pStorage = NULL;

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 

 // Copy Data Stream

 long  lSize;

 hr = pPic->SaveAsFile(pStream, TRUE, &lSize); 

 if (FAILED(hr))

 {

  pStream->Release();

  pStream = NULL;

  pStorage->Release();

  pStorage = NULL;

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 // Get Statistics For Final Size Of Byte Array

 STATSTG  statStg;

 hr = plkbyt->Stat(&statStg, STATFLAG_NONAME);

 if (FAILED(hr))

 {

  pStream->Release();

  pStream = NULL;

  pStorage->Release();

  pStorage = NULL;

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 // calculate "Pure" Picture Data, Must Be In a 512 Blocks...

 double  dbSkipFloat = (double(lSize) / 512);   

 DWORD  dwPicDataSize = 0;

 if(dbSkipFloat > DWORD(dbSkipFloat)) 

 {

  dwPicDataSize = (DWORD)dbSkipFloat + 1;

 }

 else 

 {

  dwPicDataSize = (DWORD)dbSkipFloat;

 }

 dwPicDataSize = dwPicDataSize * 512; 

 // Allocate Only The "Pure" Picture Data

 BYTE  *pPicDataBuffer = (BYTE*)malloc(dwPicDataSize);

 if (pPicDataBuffer == NULL)

 {

  pStream->Release();

  pStream = NULL;

  plkbyt->Release();

  pStorage->Release();

  pStorage = NULL;

  plkbyt = NULL;

  return FALSE;

 }

 

 // Read "Pure" Picture Data to Buffer

 _ULARGE_INTEGER ulOffset;

 ulOffset.LowPart = 0;

 ulOffset.HighPart = 0;

 ulOffset.QuadPart = (DWORD)(statStg.cbSize.QuadPart - dwPicDataSize);

 DWORD dwRealDataSize;

 hr = plkbyt->ReadAt(ulOffset, pPicDataBuffer, dwPicDataSize, &dwRealDataSize);

 if (FAILED(hr))

 {

  free(pPicDataBuffer);

  pPicDataBuffer = NULL;

  pStream->Release();

  pStream = NULL;

  pStorage->Release();

  pStorage = NULL;

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 

 // Save "Pure" Picture Data to file

 CFile  fBmp; 

 CFileException e;

 if (!fBmp.Open(szFileName, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite, &e))

 {

  free(pPicDataBuffer);

  pPicDataBuffer = NULL;

  pStream->Release();

  pStream = NULL;

  pStorage->Release();

  pStorage = NULL;

  plkbyt->Release();

  plkbyt = NULL;

  return FALSE;

 }

 fBmp.Write(pPicDataBuffer, dwRealDataSize);

 fBmp.Close();

 free(pPicDataBuffer);

 pPicDataBuffer = NULL;

 pStream->Release();

 pStream = NULL;

 pStorage->Release();

 pStorage = NULL;

 plkbyt->Release();

 plkbyt = NULL;

 return TRUE;

}



5、將IPicture中圖片按規定的尺寸儲存

BOOL CIPictureDlg::Save2File(LPCSTR szFileName, IPicture *pPic, int nWidth, int nHeight)

{

 // create a new IPicture

 OLE_HANDLE hPic = NULL;

 if (FAILED(pPic->get_Handle(&hPic)))

 {

  return FALSE;

 }

 HBITMAP hBmp = (HBITMAP)CopyImage((HANDLE)hPic,

   IMAGE_BITMAP, 

   nWidth, 

   nWidth, 

   LR_CREATEDIBSECTION);

 if (hBmp == NULL)

 {

  return FALSE;

 }

 PICTDESC picDesc;

 picDesc.cbSizeofstruct = sizeof(PICTDESC);

 picDesc.picType = PICTYPE_BITMAP;

 picDesc.bmp.hbitmap = hBmp;

 IPicture *pNewPic = NULL;

 if (SUCCEEDED(OleCreatePictureIndirect(&picDesc, IID_IPicture, FALSE, (LPVOID *)&pNewPic)))

 {

  // Save to file

  Save2File(szFileName, pNewPic);

  pNewPic->Release();

  pNewPic = NULL;

  DeleteObject(hBmp);

  hBmp = NULL;

  return TRUE;

 }

 DeleteObject(hBmp);

 hBmp = NULL;

 return FALSE;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.