用API OleLoadPicture通過IStream來載入JPG、GIF格式的圖片
阿新 • • 發佈:2019-02-04
OleLoadPicture 函式實際上建立了一個IPicture型別的COM介面物件,
然後我們可以通過這個COM介面來操作圖片
(實際上你也可以用API OleCreatePictureIndirect來載入圖片,不過相比而言OleLoadPicture函式簡化了基於流的IPicture物件的建立),
下面是示例程式碼:(注:由於只是用來示例,程式碼中省去了出錯情況的處理)
void DisplayImage(HDC hDC, LPCTSTR szImagePath) { HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); //從指定的路徑szImagePath中讀取檔案控制代碼 DWORD dwFileSize=GetFileSize(hFile, NULL); //獲得圖片檔案的大小,用來分配全域性記憶體 HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //給圖片分配全域性記憶體 void *pImageMemory=GlobalLock(hImageMemory); //鎖定記憶體 DWORD dwReadedSize; //儲存實際讀取的檔案大小 ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //讀取圖片到全域性記憶體當中 GlobalUnlock(hImageMemory); //解鎖記憶體 CloseHandle(hFile); //關閉檔案控制代碼 IStream *pIStream;//建立一個IStream介面指標,用來儲存圖片流 IPicture *pIPicture;//建立一個IPicture介面指標,表示圖片物件 CreateStreamOnHGlobal(hImageMemory, false, &pIStream) //用全域性記憶體初使化IStream介面指標 OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用leLoadPicture獲得IPicture介面指標 //得到IPicture COM介面物件後,你就可以進行獲得圖片資訊、顯示圖片等操作 OLE_XSIZE_HIMETRIC hmWidth; LE_YSIZE_HIMETRIC hmHeight; pIPicture->get_Width(&hmWidth); //用介面方法獲得圖片的寬和高 pIPicture->get_Height(&hmHeight); pIPicture->Render(hDC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上繪出圖片 GlobalFree(hImageMemory); //釋放全域性記憶體 pIStream->Release(); //釋放pIStream pIPicture->Release(); //釋放pIPicture }