CImage概況
CImage類是ATL和MFC共用的一個類,其頭檔案為atlimage.h,主要用於圖片檔案的打開,顯示與保存。這裡需要注意的是,在VS2010和VS2012的MFC編程中,不需要將頭檔案包含進來。
MFC中要使用CImage類,必須先將頭檔案包含進來,可以包含在當前代碼的CPP檔案中,也可以包含在所屬類的頭檔案中,不過最好還是包含在工程的stdafx.h檔案中。
CImage總共有39個成員函式,下面將在CImage的功能實現中慢慢講解。
一 顯示圖片
首先看下面這段代碼
CImage image;
image.Load(L"D:\\用戶目錄\\Pictures\\example.jpg");
image.Draw(GetDC()->m_hDC,CRect(0,0,320,240));
CImage類支持以Load方法讀取本地磁碟上的檔案,並用Draw方法來顯示圖片。CIamge類的成員函式中還有很多可以實現顯示圖片。例如BitBlt辦法。如以下代碼:
image.BitBlt(GetDC()->m_hDC,0,0,320,240,0,0,SRCCOPY);
Bitblt方法同CDC類的Bitblt函式一樣,是一比一地複製圖像並顯示在螢幕上,支持對源圖像取反,也就是反色顯示。這樣功能通過BitBlt的最後一個參數來實現,比如參數為NOTSRCCOPY就是反色顯示。
MaskBlt可以將圖片與目的圖片進行特殊的光柵操作並進行掩碼處理。
PlgBlt函式可以將圖片拉伸成平行四邊形進行顯示。
StretchBlt函式可以將圖片進行拉伸顯示。
二 保存圖片
保存圖片只有一個函式,就是Save函式,該函式有兩個參數,一個是檔案的完整路徑和檔案名稱,一個是檔案的擴展名。但是如果只有保存和顯示圖片功能,CImage的Save函式發揮不了太大的作用,不過是一個轉存檔案的工具。CImage的強大之處在於可以對圖片進行修改,再進行保存。
修改圖片的函式有這么3個函式可以修改圖片,都是像素級的操作。這三個函式分別為SetPixel,SetPixelRGB,SetPixelIndexed。可以通過雙重循環對螢幕進行逐點掃描,並把像素顏色值保存到CImage對象中達到截屏的目的。
我們可以用一段很簡單的代碼來實現將DC(設備上下文)里繪製的圖形存入圖片檔案中。基本的思想是先初始化一個CImage對象,再為它設定大小和位數,也就是圖片大小和圖片的色彩總數,再用設備上下文繪圖。繪製完圖形後再建立另外一個設備上下文對象,稱為目的DC,將之前繪圖的DC稱為源DC,目的DC必須與CImage對象關聯起來,然後利用BitBlt函式和其他函式將繪圖DC的內容拷貝到目的DC中,最後將CImage對象保存到檔案中,以下是代碼實現(VS2010支持中文變數名):
CRect 矩形;
this->GetClientRect(矩形);
CImage 圖像;
圖像.Create(矩形.Width(),矩形.Height(),24);
CDC* DC指針=this->GetDC();
DC指針->Ellipse(20,20,200,200);
CDC 目的DC;
目的DC.CreateCompatibleDC(DC指針);
目的DC.SelectObject(圖像);
目的DC.BitBlt(0,0,矩形.Width(),矩形.Height(),DC指針,0,0,SRCCOPY);
圖像.Save(L"D:\\用戶目錄\\Pictures\\寫圖片檔案.jpg");
三 創建空白圖片
CImage的Creat函式和CreatEx函式用來創建空白圖片,編程人員可以利用這個函式來創建圖像,並添加代碼讓用戶可以使用滑鼠來改變CImage對象的像素顏色,以實現類似於windows畫圖的功能。