CImage類的成員可分為連接與創(chuàng)建,、輸入與輸出、位圖類型與參數(shù),以及圖形繪制與位圖塊傳送等4類,。
(1) 連接與創(chuàng)建
Attach 將一個DIB(或DDB)位圖與CImage對象相連接
Detach 位圖與CImage對象相分離
Create 創(chuàng)建一個DIB位圖并將它與已有CImage對象相連接
Destroy 位圖與Cimage對象相分離并刪除
(2) 輸入與輸出
GetImporterFilterString 返回系統(tǒng)支持的輸入文件格式類型及其描述
GetExporterFilterString 返回系統(tǒng)支持的輸出文件格式類型及其描述
Load 讀入指定圖像文件中的圖像
LoadFromResource 讀入指定資源文件中的圖像
Save 按指定類型保存圖像,,文件名中不能省略后綴
IsNull 判別源圖像文件是否已經(jīng)讀入
(3) 位圖類型與參數(shù)
GetWidth 返回當前圖像的寬度(以像素為單位)
GetHeight 返回當前圖像的高度
GetBPP 返回當前圖像的每像素位數(shù)
GetBits 返回當前圖像像素數(shù)據(jù)的指針
GetPitch 返回相鄰兩行像素首地址之間的間隔
GetPixelAddress 返回指定像素數(shù)據(jù)存放位置的存儲地址
GetMaxColorTableEntries返回調(diào)色板單元數(shù)
IsDibSection 確定位圖是否為DIB位圖
IsIndexed 判別位圖中是否有調(diào)色板
IsTransparencySupported判別應(yīng)用程序是否支持透明位圖
AlphaBlend 是否支持透明或半透明顯示的狀態(tài)
(4) 圖形繪繪與位圖塊傳送
GetDC 返回當前位圖的設(shè)備描述表
ReleaseDC 釋放設(shè)備描述表
GetPixel 返回指定位置像素的顏色
SetPixel 設(shè)置指定位置像素的顏色
SetPixelIndexed 設(shè)置指定位置像素顏色的索引值
SetPixelRGB 設(shè)置指定位置像素的紅綠藍分量
GetColorTable 獲取調(diào)色板顏色分量(紅,、綠,、藍)值
SetColorTable 設(shè)置調(diào)色板顏色分量(紅,、綠、藍)值
SetTransparentColor 設(shè)置透明顏色的索引值,,只能有一種顏色可為透明
Draw 從源矩形復(fù)制到目標矩形,,支持伸縮、a融合與透明
BitBlt 位圖的一個舉行區(qū)域復(fù)制到另一位圖上的制定區(qū)域
MaskBlt 為圖塊傳送時須與指定的模板圖像做邏輯操作
PlgBlt 為圖的矩形區(qū)域到另一位圖上平行四邊形間的位塊傳輸
StretchBlt 從源矩形復(fù)制到目標矩形,,支持伸縮
TransparentBlt 位圖塊傳送時復(fù)制帶透明色的位圖
FAQ:
1. 關(guān)于GetBits()函數(shù)的使用.對于一幅DIB圖像來說,圖像的左下角為像素數(shù)據(jù)的起點,。通常我們會認為GetBits()函數(shù)返回的是圖像左下角的數(shù)據(jù)指針,,但是CImage實現(xiàn)卻不是這樣,。GetBits()返回的是圖像左上角的像素數(shù)據(jù)指針。從這個角度上來講,,它的功能等效于函數(shù)GetPixelAddress(0,0)調(diào)用,。而且CImage的成員函數(shù)中坐標是以左上角為坐標原點來表示的。
2. 關(guān)于SetPixelIndexed()函數(shù)的使用. 從函數(shù)名我們可以得知,,該函數(shù)應(yīng)該應(yīng)用于非真彩色圖像,,特別是8位的圖像。在測試該函數(shù)時,,發(fā)現(xiàn)應(yīng)用于8位BMP圖像時,,不管設(shè)置什么索引值,操作后的結(jié)果顯示索引值變成了0,。這個現(xiàn)象確實讓人匪夷所思,。不知道是不是CImage類的該函數(shù)設(shè)計有問題。當然,,如果將它不合理地應(yīng)用于真彩色圖像,,操作的結(jié)果還是黑色。
3. 另外,,CImage類中還有一些函數(shù),譬如SetPixel()和SetPixelRGB()函數(shù),,理論上應(yīng)該將它們應(yīng)用于真彩色圖像,但是如果強硬的將它們應(yīng)用于非真彩色圖像(測試中將它們應(yīng)用于8位BMP圖像),,操作結(jié)果顯示設(shè)置的值都會被“合理”的變成灰階數(shù)據(jù),,比如說,如果我們設(shè)置RGB值為(180,0,0),操作結(jié)果為調(diào)色板里的數(shù)據(jù)變?yōu)镽GB(60,60,60).
4. 直接調(diào)用CImage類的GetPixel和SetPixel效率是很低的,, 如果要循環(huán)遍歷所有Pixels的話,, 需要用GetPixelAddress直接取得像素數(shù)據(jù)的存儲地址, 然后進行操作,。這種方法有個問題: How to handle the PixelAddresses correctly with diffrent kinds of BPPs (Bits Per Pixel).
For 24 BPP Images:
for setting
inline void setPixel(int x, int y, COLORREF &c)
{
BYTE *p = (BYTE*)imgage.GetPixelAddress(x, y);
*p++ = GetRValue(c);
*p++ = GetGValue(c);
*p = GetBValue(c);
}
& for getting a pixel
inline COLORREF getPixel(int x, int y) const
{
return(*(COLORREF*)(image.GetPixelAddress(x, y)));
}
For 16 BPP Images:
16-bit images would be easy to support, and they are much similar to 32-bit images.
16-bit colour pixels are stored in 5-6-5 format (five bits for red, six bits for green, and five for blue).
inline void setPixel(int x, int y, COLORREF &c)
{
WORD *p = (WORD*)imgage.GetPixelAddress(x, y);
*p = ((GetRValue(c) >> 3) << 11) + ((GetGValue(c) >> 2) << 5) + (GetBValue(c) >> 3);
}
inline COLORREF getPixel(int x, int y) const
{
WORD *p = (WORD*)image.GetPixelAddress(x, y);
return RGB(((*p & 0xF800) >> 8), ((*p & 0x07E0) >> 3), ((*p & 0x001F) << 3));
}
Ref: http://www./forum/archive/index.php/t-315327.html
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1604216