1. 程式人生 > >用API OleLoadPicture通過IStream來載入JPG、GIF格式的圖片

用API OleLoadPicture通過IStream來載入JPG、GIF格式的圖片

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   
}