【QT技術應用】2D繪圖(2)
編輯:落鶴生 時間:2011-02-16
14:17 點擊:1468次
QPixmap QPixmap主要完成屏幕後臺 (off-screen)緩衝區繪圖。QPixmap對象可以使用QLabel或QAbstractButton子類 (QPushButton,QToolButton)顯示,QLabel通過設置pixmap屬性,QAbstractButton通過設置icon屬性 來完成,
QPixmap
QPixmap主要完成屏幕後臺 (off-screen)緩衝區繪圖。QPixmap對象可以使用QLabel或QAbstractButton子類 (QPushButton,QToolButton)顯示,QLabel通過設置pixmap屬性,QAbstractButton通過設置icon屬性 來完成,除了使用構造函數初始化,QPixmap對象還可以使用靜態函數grabWidget()和grabWindow()函數創建,並繪製指定的窗口 和窗口部件.QPixmap中的像素數據時內部的,並且由底層的窗口系統進行管理,如果要存取像素,只有通過QPrinter函數將QPixmap對戲那
個轉換爲QImage對象,根據底層系統的不同,QPixmap可以RGB32或者混合alpha格式存儲,如果圖像有Alpha通道且底層系統允許,則 優先使用混合alpha格式,因此QPixmap時依賴於底層系統的,在X11上和Mac上,QPixmap存儲在服務器端,QImage存儲在客戶點,
在windows上,這兩個類表達方式時相同的。QImage和QPixmap可以相互轉換,通常QImage載入圖像並進行直接操作,然後轉換爲 QPixmap在屏幕上顯示。如果不需要操作像素,就直接使用QPixmap.在windows上,QPixmap還可以與HBITMAP之間相互轉 換,QPixmap和QImage一樣使用隱式共享,也能夠使用數據流。
========================================= 組合模式繪圖
組 合模式(Composition Mode)用來指定如何合併源圖像和一個圖像,最常見的是SourceOver(通常也叫alpha混合),當原像素和目標像素以這種方式混合時,源圖像 的alpha通道定義了像素的透明度。組合模式繪圖只支持Format_ARGB32_Premultiplied和Format_ARGB32格格式, 而且應該優先使用Format_ARGB32_Premultiplied格式,設置了組合模式後,它對所有的繪圖操作都有效,如畫筆,畫刷,漸變效果和 pixmap/image繪製。QPainter::CompositeMode枚舉類型中前12中組合類型是T.Porter和T.Duff於1984
年在淪爲(Compositing Digital Image)中闡明的12種混合規則(Porter-Duff規則)混合的計算方法在此給出。以便理解混合的過程。
首先定義混合的因子 :
As: 原像素的alpha分量
Cs: 原像素種計算好(premultiplied)色彩分量
Ad: 目標像素的alpha分量
Cd; 目標像素計算好的色彩分量
Fs: 原像素在輸出結果種佔有的比例
Fd: 目標像素在輸出結果種佔有的比例
Ar: 輸出結果種的Alpha分量
Cr: 輸出結果種計算好的色彩分量
Porter和Duff定義了選擇混合因子Fs和Fd產生不同的視覺效果的12種規則,最終結果種的Alpha值和色彩值由下面的公式決定
Fs=f(Ad);
Fd=f(As);
Ar=AsxFs+AdxFd
Cr=CsxFs+CdxFd
每種類型的Fs和Fd取值如表所示
------------------------------------------------------------------------------------------
常 量 Fs Fd 說明
QPainter::CompositionMode_SourceOver 1 1-As 默認模式,源alpha和目標像素混合
QPainter::CompositionMode_DestinationOver 1-Ad 1 和SourceOver相反,目標Alpha和源像素混合
QPainter::CompositionMode_Clear N/A N/A 清除目標像素
QPainter::CompositionMode_Source N/A N/A 輸出源像素
QPainter::CompositionMode_SourceIn Ad 0 在目標部分的源替代目標
QPainter::CompositionMode_DestinationI 0 As 於SourceIn相反
QPainter::CompositionMode_SourceOut 1-Ad 0 在目標之外的源替代目標
QPainter::CompositionMode_DestinationOut 0 1-As 於SourceOut相反
Qpainter::CompositionMode_SourceAtop Ad 1-As 在目標部分的源和目標組合
QPainter::CompositionMode_DestinationAtop 1-Ad As 與sourceatop相反
QPainter::CompositionMode_Xor 1-Ad 1-As 在目標之外的源和源之外的目標混合
--------------------------------------------------------------------------------------------------------
注意,上面的說明並沒有完全概括各種混合的含義,要準確理解他們可以看公式並進行實踐,畜類上面12種Porter_Duff規則外,Qt還支持12種擴展混合模式。下面給出計算公式需要注意如果結果中alpha值和色彩值超過0-255的範圍,數值將會被截斷
1 QPainter::CompositionMode_Plus 源和目標相加,該操作實現動畫中兩幅圖像的溶解和過度過程。Cr=Cs+Cd Ar=As+Ad
2 QPainter::CompositionMode_Multiply 源和目標進行正片疊底(multiply)操作。結果的顏色至少是源和目標種較暗的顏色。任何顏色和黑色作該操作產生黑色。任何顏色和白色作該操作將不會改變。Cr=CsxCd+Csx(1-Ad)+Cdx(1-As) Ar=AsxAd+Asx(1-Ad)+Adx(1-As)=As+Ad-AsxAd
3 QPainter::CompositionMode_Screen 源和目標互補然後相乘結果的顏色至少是源和目標種較亮的顏色。任何顏色和黑色進行濾色操作不會改變,任何顏色和白色進行濾色操作還是白色
4 QPainter::CompositionMode_Overlay 根據目標顏色值不同,進行相乘操作或濾色操作,源色彩保持亮度和陰影覆蓋在目標上。目標顏色和源顏色混合以反應目標的亮度。
5 QPainter::CompositionMode_Darken 選擇源和目標種較暗的顏色
6 QPainter::CompositionMode_Lighten 選擇源和目標種較亮的顏色
7 QPainter::CompositoinMode_ColorDodge 加亮目標顏色以反應源顏色,繪製黑色將沒有效果
8 QPainter::CompositionMode_ColorBurn 使目標顏色變暗以反應源顏色,繪製白色沒有效果。
9 QPainter::CompositionMode_HardLight 根據源的顏色,決定是正片疊底還是濾色操作。如果源顏色高於0.5,目標顏色將變亮。即進行濾色操作。如果源顏色亮度值低於0.5,目標將會變暗,相當於進行了正片疊底操作。如果源亮度值等於0.5,目標不會改變,變亮或者變暗成都取決於源顏色和0.5的差,繪製純黑色和純白色結果還是純黑或純白。
10 QPainter::CompositionMode_SoftLight 根據源的顏色,決定進行變暗(darken)操作還是變亮(lighten)操作。如果源顏色比0.5亮,目標將變亮,即進行了濾色操作。如果源顏色比0.5暗,目標將變暗,相當於進行了顏色加深(burn)操作,如果等於0.5.目標不會發生改變。變亮或者變暗的程度取決於源顏色和0.5的差值。
11 QPainter::CompositionMode_Difference 源和目標種較暗的顏色減去較亮的顏色,繪製導致白色反轉成目標顏色黑色化
12 Qpainter::CompositionMode_Exclusion 和上一條規則的效果類似,但對比對較低一些,繪製白色將導致反轉成目標顏色,繪製黑色沒有
|