使用畫筆
畫筆的屬性包括線型,線寬,顏色等。畫筆的屬性可以在建構函式中指定,也可以使用
setStyle(),setWidth(),setBrush(),setCapStyle(),setJoinStyle()等函數
逐項設定
畫筆的各項屬性.Qt中使用Qt::PenStyle定義了6種畫筆風格,分別是
Qt::SolidLine,Qt::DashLine,Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,
Qt::CustomDashLine.
自訂線風格(Qt::CustomDashLine),需要使用QPen的setDashPattern()函數來設定自訂風格.
下面代碼設
置了一個自訂QPen
QPen pen;
QVector customDashes;
qreal blank=4;
dashes<<2<
pen.setDashPattern(customDashes);
端點風格(cap style)
端點風格決定了線的端點
樣式,它只對線寬大於1的線有效。Qt種定義了三種端點風格用枚舉類型Qt::PenCapStyle表示,分別為
Qt::SqureCap,QT::FlatCap,Qt::RoundCap,
串連風格(Join style)
串連風格是兩條線如何
串連,串連風格對線寬大於等於1的線有效。Qt定義了四種串連方式用枚舉類型Qt::PenStyle表示.分別是
Qt::MiterJoin,Qt::BevelJoin,Qt::RoundJoin.
Qt::SvgMiterJoin.
2.
畫刷
在Qt中圖形使用QBrush進行填充,畫刷包括填充顏色和風格(填充模式).在Qt中,顏色使用QColor類表示,QColor支援
RGB,HSV,CMYK顏色模型。QColor還支援alpha混合的輪廓和
填充。基本模式填充包括有各種點,線組合的模式。Qt支援
RGB,HSV,和CMYK顏色模型。RGB是面向硬體的模型。顏色由紅綠藍三種基色混合而成。HSV模型比較符合人對顏色的感覺,由
色調
(0-359),飽和度(0-255),亮度(0-255)組成.CMYK由青,洋紅,黃,黑四種基色組成。主要用於印表機等硬體拷貝裝置上。每個顏色分
量的取值是0-255.另外QColor還可以用
SVG1.0中定義的任何顏色名為參數初始化.
Qt4提供了漸層填充的畫刷,漸
變填充包括兩個要素,顏色的變化和路徑的變化。顏色變化可以指定從一種色彩坡形到另外一種顏色。也可以在變化的路徑上指定一些點的顏色進行分段漸層。
Qt4
中,提供了三種漸層填充:線性(QLinearGradient),圓形(QRadialGradient)和圓錐漸層
(QConicalGradient).所有的類都從QGradient類繼承.
------------------
線性漸層
填充
線性漸層填充指定兩個控制點,畫刷在兩個控制點之間進行顏色插值。通過建立QLinearGradient對象來設定畫刷.
QLinearGradient
linearGradient(0,0,200,100);
linearGradient.setColorAt(0,Qt::red);
linearGradient.setColorAt(0.5,Qt::green);
linearGradient.setColorAt(1,Qt::blue);
painter.setBrush(linearGradient);
painter.drawRect(0,0,200,100);
在
QGradient建構函式中指定線行填充的兩點分別為(0,0),(100,100).setColorAt()函數在0-1之間設定指定位置的顏 ------------------
圓形漸層填充
圓形漸層填充需要指定圓心,半徑和焦點。畫刷在焦點和圓上的所有點之間進行
顏色插值。建立QRadialGradient對象設定畫刷
QRadialGradient
radialGradient(50,50,50,30,30);
radialGradient.setColorAt(0.2,Qt::cyan);
radialGradient.setColorAt(0.8,Qt::yellow);
radialGradient.setColorAt(1,Qt::magenta);
painter.setBrush(radialGradient);
painter.drawEllipse(0,0,100,100);
-------------------------------
圓
錐漸層填充
圓錐漸層填充指定圓心和開始角,畫刷沿圓心逆時針對顏色進行插值,建立QConicalGradient對象並設定畫刷.
QConicalGradient
conicalGradient(60,40,30);
conicalGradient.setColorAt(0,Qt::gray);
conicalGradient.setColorAt(0.4,Qt::darkGreen);
conicalGradient.setColorAt(0.6,Qt::darkMagenta);
conicalGradient.setColorAt(1,Qt::drakBlue);
painter.setBrush(conicalGradient);
painter.drawEllipse(0,0,100,100);
---------------------------------
為
了實現自訂填充,還可以使用QPixmap或者QImage對象進行紋理填充。兩種映像分別使用setTexture()和
setTextureImage()函數載入紋理.
======================================================================================================================
雙
緩衝繪圖
在Qt4中,所有的視窗組件預設都使用雙緩衝進行繪圖。使用雙緩衝,可以減輕繪製的閃爍感。在有些情況下,使用者要關閉雙緩衝,自己管理繪
圖。下面的語句設定了視窗組件
的Qt::WA_PaintOnScreen屬性 ,就關閉了視窗組件的雙緩衝.
mywidget->setAttribute(Qt::WA_PaintOnScreen);
由
於Qt4不再提供異或筆,組合模式QPainter::CompostionMode_Xor()並不是異或筆,Qt4隻提供了QRubberBand實
現矩形和直線的繪圖反饋。因此要實現在繪圖中動態
反饋必須使用其他方法。程式中使用雙環衝來解決這個問題。在繪圖過程中,一個緩衝區繪製臨時內
存,一個緩衝區儲存繪製好的內容,最後進行合并。
在互動繪圖過程中,程式將映像緩衝區複製到臨時緩衝區,並在臨時緩衝區上繪製,繪製完畢在將結果
複製到映像緩衝區,如果沒有互動複製,則直接將映像緩衝區繪製顯示到螢幕上。
------------------------
使用
alpha通道
在windows,Mac
OSX和有XRender擴充的X11系統上,Qt4能夠支援Alpha通道,通過使用Alpha通道,可以實現半透明效果,QColor類中定義了
Alpha通道的透明度,0表示完全透明
255表示完全不透明。注意QWidget類有一個屬性windowOpacity,通過
setWindowOpacity(qreal level)可以設定視窗的透明度。但該屬性和Alpha通道的原理並不相同,Qt4在
Windows
和Mac OS
X平台上才支援該屬性,但在X11平台上卻需要Composite擴充才能工作。(alpha通道使用的是X11的xRender擴充).
---------------------------------------
繪
圖裝置
QPaintDevice類是實際的繪製裝置的基類.QPainter能夠在QPaintDevice子類上進行繪製,如
QWidget,QImage,QPixmap,QGLWidget,QGLPixelBuffer,QPicture,QPrinter
QSvgGenerator.
要實現自己的繪圖裝置,必須從QPaintDevice類繼承並實現其虛函數QPaintDevice::paintEngine()以告之
QPainter能夠在這個特定的裝置上繪製圖形,同時還需要從
QPaintEngine類繼承自訂的圖形繪製引擎。
1
QWidget
QWidget是所有使用者介面元素的基類,視窗組件時使用者介面的原子項目,他接受滑鼠,鍵盤,視窗系統的其他事件並在螢幕上繪製自
己。
2 QImage
QImage類提供了與硬體無關的映像表示,它為直接操作像素提供最佳化,QImage支援單色,8-bit,32-
bit和alpha混合映像,使用QImage的優點在於可以獲得平台無關的繪製操作,另外還有一個好處
時映像可以不必在GUI線程中處理。
3
QPixmap
QPixmap時後台顯示的映像,它為在螢幕上顯示映像提供最佳化,不同於QImage,pixmap的映像資料使用者不可見,而且
由底層視窗系統管理,為了最佳化QPixmap映像,Qt提供了QPixmapCache類來儲存
臨時的pixmap.Qt還提供了QPixmap
的繼承類QBitmap類,QBitmap表示單色的pixmap,主要用來建立自訂的QCursor和QBrush對象,構造QRegion對象,設
置pixmap和視窗組件的掩碼。
4 OPenGLWidget
Qt提供了QtOpenGL模組來實現OpenGL操
作,QGLWidget允許使用OpenGL
API進行繪製。同時QGLWidget時QWidget的子類,因此QPainter也可以在上面繪製。這樣可以使Qt能夠利用OpenGl
完
成繪製操作,如變換和繪製pixmap
5 pixel Buffer
QGLPixelBuffer從QPaintDevice繼承,封裝
了OpenGL pbuffer.使用pbuffer繪製通常時全硬體加速,這比使用QPixmap繪製更為迅速。
6 FrameBuffer
QGLFrameBufferObject
從QPaintDevice繼承,QGLFrameBufferObject封裝了OpenGL
frameBuffer對象,FrameBuffer對戲那個用來實現後台螢幕繪製,比pixel buffer更好一些。 7 picture
QPicture類時能夠記錄和重演QPainter命令的繪圖裝置,picture序列化painter的命令為
平台無關的格式,QPicture同時也於解析度無關,如QPicuture能夠在不同的裝置上(svg,pdf,ps
印表機和螢幕)有一隻的顯
示。QPicture::load()和QPicture::save()函數分別完成載入和儲存映像。
8 Printer
QPrinter
類時在印表機上繪製的繪圖裝置,在Windows和MAC OS
X上,QPrinter使用內建的印表機驅動程式,在X11上,QPrinter山城postscript代碼並發送給lpr,lp或者其他列印程
序,QPrinter可以在任意其他QPrintEngine對象上列印,也可以直接產生PDF檔案。
QPrintEngine類定義了
QPrinter如何和其他印表機系統互動的介面,主要建立自己的列印引擎時,可以從QPaintEngine和QPaintEngine上繼承。
======================================================================================================
座標系統與座標變換
1. Qt座標系統由QPainter控制,同時也由
QPaintDevice和QPaintEngine類控制.QPaintDevice類是繪圖裝置的基
類,QWidget,QPixmap,QImage,和QPrinter都是QPaintDevice類的子類。Qt繪圖裝置預設座標原點是左上方,X軸
向右增長,Y軸向下增長,預設的單位在基於像素的裝置上是像素,在印表機裝置上是1/72英寸(0.35毫米).QPainter的邏輯座標與
QPainterDevice的物理座標之間的映射由QPainter的變換矩陣,視口和視窗處理。邏輯座標和物理座標也是一直的。QPainter也支
持座標變換(如旋轉和伸縮);
2. 座標變換。
通常QPainer在裝置的座標系統上繪製圖形,但QPainter也支援座標變換。可以通過QPainter::scale()函數進行比例變換。使用
QPainter::rotate()函數進行旋轉變換。平移變換則使用QPainter::translate()函
數,QPainter::shear()函數對圖形進行扭曲操作,所有變換操作的變換矩陣都可以通過QPainter::wordMatrix()函數取
出。不同的變換矩陣可以使用堆棧儲存。
用QPainter::save()儲存變換矩陣到堆棧,用QPainter::restore()函數將
其彈出堆棧。
QMatrix定義了系統的二維變換。QMatrix對象實際上定義了一個3x3矩陣。
--------------
m11 m12 0
m21 m22 0
dx dy 1
---------------<br /> x//'=m11*x+m21*y+dx;
y//'=m22*y+m12*x+dy;
其
中dx,dy表示水平和垂直位移量,m11,m22表示水平和垂直方向上的比例。m12和m21表示水平和垂直方向上的扭曲程度。
矩陣可以
通過setMatrix函數進行設定,然後可以使用translate(),rotate(),scale(),shear()等函數進行變
換.Qt4.3中引入QTransform類表示變換矩陣。與QMatrix不同的是,QTransform()支援透視變換。使用toAffine()
函數可以將QTransform對象轉換為QMatrix對象。這將丟失QTransform的透視變換資料。邏輯座標和物理座標的變換由
QPainter的worldMatrix()函數。以及QPainter的viewport()和window()函數處理。視口表示物理座標下的任意
矩形。而在視窗表示在邏輯座標下的相同矩形。預設情況下邏輯座標與物理座標時相同的。與繪圖裝置上的矩形也是一致的。使用視窗-視口變換可以使邏輯座標符
合自訂要求,這個機制通常用來完成裝置無關的繪圖代碼。例如,可以設定邏輯座標(-100,-100)到(100,100)且在原點(0,0),通過調
用QPainter::setWindow()函數可以完成下列操作。
QPainter painter(this);
painter.setWindow(QRect(-100,-100,200,200));
現
在,邏輯座標的(-100,-100)對應著繪圖裝置的(0,0),這樣可以繪製獨立於裝置,始終在指定邏輯座標上工作。設定視窗或視口矩形實際上是執行
線性變換。本質上是視窗四個角映射到對應的視口四個角,反之亦然,因此保持視口和視窗x軸和y軸之間的比例變換一致,保證變換沒有變形。視窗-視口變換隻
是線性變換,不執行裁剪操作,例如當繪製超出視窗後,這些繪製仍然 通過線性變換映射到
視口進行繪製。Qt的繪製過程是進行座標變換,在進行視窗
-視口變換。
==================================================================================================================
使用不同的字型
Qt提供了Font類來表示字型,當建立QFont對象時,Qt會使用指定的字型,如果沒有對應的字型,Qt將尋找一種最接近的已安裝字型。字型資訊可以
通過
QFontInfo取出,並可用QFontMetrics取得字型的相關資料。函數exactMatch()判斷底層視窗系統中是否有完全對
應的字型。使用QApplication::setFont()可以設定應用程式預設的字型,如果選擇的字型不包括所有要顯示的字元,QFont將會嘗試
尋找最基接近的字型。當QPainter繪製指定的字型中不存在的字元時
將繪製一個空心的正方行。 繪圖路徑 --QPainterPath
繪圖路徑(painter
path)由基本圖元(矩形,橢圓,直線,曲線)組成,繪圖路徑可以是閉合的路徑,如矩形和圓,或者是非閉合的路徑,如直線和曲線。繪圖路徑在Qt中使用
QPainterPth類表示,
它提供了繪圖操作的容器,可以使圖形能夠複用。繪圖路徑可以進行填充,顯示輪廓和裁剪。要產生可填充的輪廓的繪圖
路徑,可以使用QPainterPathStroker類.使用QPainterPath的優點是複雜的
圖形只需建立一次,就可以多次使用。
QPainterPath對象可以時只有起點的空路徑,或者從其他QPainterPath對象複製,建立了QPainterPath對象後,可以使用
lineTo(),cubicTo(),
quadTo()函數將直線和曲線添加到路徑中來,直線和曲線從currentPosition()開始
繪製。currentPosition()總是返回最後的子路經繪製的終點。使用moveTo()函數可以在不增加路徑的情況下移動
currentPositon(),它關閉了一個子路經,開始一個新的子路經。closeSubPath()也可以關閉當前路徑,並從
currentPosition()串連一條直線到繪圖路徑的起點。QPainter可以使用
addEllipse(),addPath(),addRect(),addRegion(),addText()將Qt的一些基本圖元加入繪圖路徑。一
個已有的繪圖路徑可以通過connectPath()函數加入到另一個繪圖路徑中。
如下代碼繪製了一個箭頭:
QPainterPath
path;
path.moveTo(10,100);
path.cubicTo(10,100,100,10,200,70);
path.lineTo(200,50);
path.lineTo(220,80);
path.lineTo(200,110);
path.lineTo(200,90);
path.cuticTo(200,100,100,50,50,100);
QPainter
painter(this);
QPen pen(QColor(255,0,0),2);
painter.setPen(pen);
painter.drawPath(path);
Qt
提供了兩種填充方式,Qt::OddEventFill和Qt::WindingFill.Qt::OddEvent時預設的填充規則,它指定
QPainterPath使用奇偶填充規則,該規則判斷一個點是否在論經圖形內的方法是從該店畫一條水平線到路徑外,計算水平線和路徑的交點數,如果交點
時奇數個則說明該點在路徑圖形內。QPainterPath還有一些函數可以擷取路徑資訊,如elementAt()函數可以取出指定的子路經元素,
isEmpty()
函數判斷當前路徑是否為空白。controlPointRect()函數返迴路徑中所有的點和控制點的矩形,該函數運行速度比返回精確包容框
boundingRect()函數快得多。contains()函數判斷一個點或一個矩形是否在路徑內。intersects()判斷指定的矩形與路徑是
否相交.QPainterPath可以將矩形圖形轉換為其他圖形,如使用
toFillPolygon(),toFillPolygon(),toSubpathPOlygons()函數將路徑轉化為多邊形。
QPainterPath
還可以使用文字作為路徑,下面的代碼示範了文字路徑,並使用線性漸層填充。
QLinearGradient
linearGrad(QPointF(200,0),QPointF(1000,0));
linearGrad.setColorAt(0,Qt::black);
linearGrad.setColorAt(1,Qt::white);
QFont
font("隸書",80);
font.setBold(true);
QPainterPath textPath();
textPath.addText(200,300,font,tr("
電子工業出版社"));
painter.setBrush(linearGrad);
painter.drawPath(textPath);
===========================================================================
QImage和QPixmap繪圖裝置
Qt提供了4個處理映像的類。QImage,QPixmap,QBitmap,QPicure.他們有著
各自的特點。QImage最佳化了I/O操作,可以直接存取操作像素資料。QPixmap主要用來在螢幕上顯示映像。QBitmap從QPixmap繼承,
只能表示兩種顏色,QPicture是可以記錄和重放QPrinter命令的類。QImage提供了與硬體無關的映像表示方法。通過QImage可以直接
存取像素資料,QImage也可以用作繪圖裝置。
QImage支援的映像顏色可以是單色,8位,32位和alpha混合的格式。因為QImage
從QPainterDevice繼承,所以QPainter可以直接在QImage上繪圖。除了繪製文字格式外(QFont依賴於底層的GUI).其他的
繪製操作可以在任意線程中完成,如果要在其他線程中繪製文字,可以使用QPainterPath。QImage對象具有隱式共用,作為傳值參數,可以使用
資料流及進行比較等特性。
讀入映像可以通過QImage建構函式,load(),loadFromData()幾種方法完成。還可以通過
QImage的靜態函數fromData()由指定資料構造一個QImage對象。既可以從檔案系統裝入,也可以從Qt應用程式的嵌入式資源中讀取,使用
save()可以儲存QImage對象。可以通過QImageReader::supportedImageFormats()和
QImageWriter::supportedImageFormats()擷取QImage支援的所有檔案格式列表。 ------------------------------------------
QImage函數
--------------------------------------------------------------------------------------------------------------------------------------------------
幾
何函數 size(),widt(),dotsPermeterX(),dotsPerMeterY()函數擷取映像大小和比例資訊。
rect()
函數返回映像的包容矩形,valid()測試給定的座標是否在此矩形內。offset()擷取映像和其他映像之間的相對位移量。setOffset()函
數設定位移量。
顏色函數
某個像素的顏色可以通過pixel函數擷取,傳回值是QRgb類型,對於單色和256色映像,colorTable()返回調色盤,numColors返
回調色盤中的條目數.用pixelIndex()
函數擷取像素的色彩索引,然後使用color()函數取出實際的顏色值.hasAlphaChannel()函數返回映像是否使用了alpha通道。
allGray(),isGrayscale()測試映像是否為灰階映像。
文字 text()函數返回映像附屬的文
字,textKeys()返迴文字的索引值表。setText()函數改變映像附屬文字.
低級資訊
depth()函數擷取映像顏色位元.支援1,8,32位.format().bytesPerLine()和numBytes()函數返回映像的資料存
儲資訊.serieralNumber()函數取得唯一標識QImage對象的數字.
--------------------------------------------------------------------------------------------------------------------------------------------------
QImage
的8位和單色映像採用色彩索引表的方式存取,32為的映像則直接儲存ARGB值.因此他們的像素操作函數也不相同,對32位的映像,setPixel()
函數可以改變指定像素的QRgb顏色值,對8位和
單色映像,setPixel()改變在預定義顏色表中的索引值,如果要改變顏色表,可以使用
setColor()函數。QImage提供scanLine()函數返回指定行的資料。bits()函數返回第一個像素的指標。每個像素在QImage
中都使用整數形式表示。單色映像使用一位的索引指向只有兩種顏色的調色盤,有兩種類型的單色映像,big endia(MSB),little
endian(LSB).256色映像使用8位顏色調色盤,調色盤的資料類型是QVector,QRgb實際上時不帶正負號的整數型,儲存ARGB的格式是
0xAARRGGBB.32位的映像直接儲存,有三種類型的儲存格式:RGB,ARGB和已預乘的ARGB。在已預乘ARGB中,紅綠藍三色已經和
alpha相乘並模除255.allGray()和isGrayscale()函數可以判斷一個彩色映像能否安全轉化為灰階映像。映像的格式用
format()函數讀取出,convertToFormat()可以進行映像格式轉化,QImage支援的儲存格式如下:
QImage::Format_Mono 單
色映像(MSB)
QImage::Format_MonoLSB 單色映像(LSB)
QImage::Format_Indexed8 使
用顏色表的256色映像
QImage::Format_RGB32 不支援Alpha通道的32位元影像像
QImage::FOrmat_ARGB32 含
Alpha通道的32位元影像像
QImage::Format_ARGB32_Premultiplied
已預乘的含Alpha通道的32位元影像像.
-----------------------------------
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 和上一條規則的效果類似,但對比對較低一些,繪製白色將導致反轉成
目標顏色,繪製黑色沒有