VC下加載JPG/GIF/PNG圖片的兩種方法

轉自:http://www.junsoft.cn/showtopic-377.aspx

僅管VC有提供相應的API和類來操作bmp位圖、圖標和(增強)元文件,但卻不支持jpg、gif和png等格式的圖片,而這幾種格式卻是常常要用到的。這裏我給大家介紹兩種辦法來操作這些格式的圖片。

1。用API OleLoadPicture來加載JPG、GIF格式的圖片(注:不支持PNG格式,另外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));//用OleLoadPicture獲得IPicture接口指針
 
 
 
         //得到IPicture COM接口對象後,你就可以進行獲得圖片信息、顯示圖片等操作
 
         OLE_XSIZE_HIMETRIC hmWidth;
 
         OLE_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
 
 }
 
 


2。利用第三方的開發庫來操作圖片(如果你願意,也可以自已來寫^_^)。

這 裏我向大家推薦一個庫CxImage。 CxImage裏面包含了許多的類,可以用來加載、保存、顯示和變換圖片,而且支持許多的圖片格式,包括BMP、 JPEG、 GIF、 PNG、 TIFF、 MNG、 ICO、 PCX、 TGA、 WMF、 WBMP、 JBG、 J2K等。另外CxImage也支持Alpha通道,動畫幀等許多功能,而且它還是開源免費的。CxImage的當前的版本是v6.00, 介紹和下載可以訪問:http://www.codeproject.com/KB/graphics/cximage.aspx。CxImage的用法十分簡單,示例如下(省去出錯處理):
 
 
 
 void DisplayImage(HDC hDC, CString fileName)
 
 {
 
         CString fileExt; //圖片的擴展名
 
         int len = fileName.GetLength();
 
         for(int i=len-1; i>=0; i--) //得到圖片的擴展名
 
         {
 
                 if(fileName[ i ] == '.')
 
                 {
 
                         fileExt=fileName.Mid(i+1);
 
                         break;
 
                 }
 
         }
 
         fileExt.MakeLower(); //將擴展名轉爲小寫
 
         if(fileExt != _T(""))
 
         {
 
                 //創建CxImage對象,其中靜態方法CxImage::GetTypeIdFromName用來根據擴展名獲得圖片格式的ID代表
 
                 CxImage image(fileName,CxImage::GetTypeIdFromName(fileExt));
 
                 if(image.IsValid())
 
                 {
 
                         image.Draw(hDC);
 
                         image.Destroy();
 
                 }
 
         }
 
 }
 
 

當然,也還有其它許許多多的開源的庫可以用,你可以根據你自已的需要來選擇。:)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章