VC操作Image的三種方法(收集)


忘記從哪來收集過來的資料了,暫且不管是哪位老兄寫的,只道一聲謝謝。


僅管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(); 
                    } 
            } 
    }


3 提供一中更簡單的方法


VC MFC 提供的 API LoadBitmap / LoadImage 類 CBitmap 等都只能操作 BMP 位圖,圖標。對於其他常用的 JPG / JPEG / GIF / PNG 格式,它無能為力。VC 下怎樣才能加載各種非 BMP 格式的圖片呢? 下面介紹一種最簡單的辦法。用 CImage 類的 Load 函數加載圖片,之后用 Detach 取得 HBITMAP 句柄。取得圖片的HBITMAP 句柄后就可以像操作 BMP 圖片一樣處理 JPG / JPEG / GIF / PNG 格式的圖片了。具體代碼如下: 


#include “atlimage.h” 


CImage img; 


HRESULT ret = img.Load(filename ); // filename 是要加載的文件名(包含路徑) 


HBITMAP hBitmap = img.Detach(); 


//像操作 BMP 圖片一樣處理圖片 ,例如:顯示圖片


CBitmap cBitmap;
CClientDC* pDC = new CClientDC(this);
BITMAP bitmap;
CDC memdc;
cBitmap.Attach(hBitmap);
memdc.CreateCompatibleDC(pDC);
memdc.SelectObject(hBitmap);
cBitmap.GetBitmap(&bitmap);

pDC->StretchBlt(0, 0, bitmap.bmWidth, bitmap.bmHeight, &memdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);

 

轉載:http://www.360doc.com/content/13/1210/16/9970815_336110174.shtml#

http://blog.csdn.net/chence19871/article/details/47108943


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM