2D繪圖
Qt4中的2D繪圖部分稱爲Arthur繪圖系統.它由3個類支撐整個框架,QPainter,QPainterDevice和QPainterEngine.QPainter用來執行具體的繪圖相關操做
如畫點,畫線,填充,變換,alpha通道等。QPainterDevice是QPainter用來繪圖的繪圖設備,Qt中有幾種預約義的繪圖設備,如QWidget,QPixamp,QPrinter
等.他們都從QPaintDevice繼承。QPaintEngine類提供了不一樣類型設備的接口,QPaintEngine對程序員不透明,由QPainter,QPaintDevice類與其進行交互。
從Qt4.2開始,Graphics View框架取代了QCanvas,QGraphics View框架使用了MVC模式,適合對大量2D圖元的管理,Grphics View框架中,場景(scene)
存儲了圖形數據,它經過視圖(view)以多種表現形式,每一個圖元(item)能夠單獨進行控制.
Arthur繪圖基礎
在Arthur繪圖框架中的基本繪圖元素是畫筆,畫刷。
QPainter類具備GUI程序須要的絕大多數函數,可以繪製基本圖形(點,線,矩形,多邊形等)以及複雜的圖形(如繪圖路徑).使用繪圖路徑(QPaintPath)的優勢是複雜形狀
的圖形之用生成一次,之後再使用的時候是須要調用QPainter::drawPath()就能夠了。QPainterPath對象能夠用來填充,繪製輪廓。
線和輪廓均可以用畫筆(QPen)進行繪製,畫刷(QBrush)進行填充。畫筆定義了風格(線形),寬度,筆尖畫刷以及端點是如何繪製的(cap-style),端點的鏈接方式(join-style)
.畫刷用來填充畫筆繪製的圖形,能夠定製不一樣的填充模式和顏色的畫刷。
當繪製文字時,字體使用QFont類定義,Qt使用指定字體的屬性,若是沒有匹配的字體,Qt將使用最接近的字體。字體屬性能夠經過QFontInfo來獲取。字體的度量(measurement)
使用QFontMetrics類來獲取。QFontDatabase類能夠得到底層窗口系統全部可用的字體.
一般狀況下QPainter以默認的座標系統進行繪製,也能夠用QMatrix類對座標進行變換。
當繪製時,可使用QPainter::RenderHint來告訴繪圖引擎是否啓用飯鋸齒功能使圖變得平滑。
QPainter::RenderHint的可取如表6-1中的值
------------------------------------------------------------------------------------------------
QPainter::Antialiasing 告訴繪圖引擎應該在可能的狀況下進行邊的反鋸齒繪製
QPainter::TextAntialiasing 儘量的狀況下文字的反鋸齒繪製
QPainter::SmoothPixmapTransform 使用平滑的pixmap變換算法(雙線性插值算法),而不是近鄰插值算法
-------------------------------------------------------------------------------------------------
QPainter的繪圖函數
-------------------------------------------------------------------------------------------------
drawArc() 弧
drawChord() 弦
drawConvexPolygon() 凸多邊形
drawEllipse() 橢圓
drawImage() QImage表示的圖像
drawLine() 線
drawLines() 多條線
drawPath() 路徑
drawPicture() 按QPainter指令繪製
drawPie() 扇形
drawPixmap() QPixmap表示的圖像
drawPoint() 點
drawPoints() 多個點
drawPolygon() 多邊形
drawPolyline() 多折線
drawRect() 矩形
drawRects() 多個矩形
drawRoundRect() 圓角矩形
drawText() 文字
drawTiledPixmap() 平鋪圖像
drawLineSegments() 繪製折線
------------------------------------------------------------------------------------------------
drawPicture()函數負責繪製QPicture中存儲的QPainter指令,QPicture是能夠記錄QPainter繪圖指令的類.它將QPainter的繪圖指令串行化爲平臺無關的存儲格式。
下面的代碼將記錄的繪圖指令重繪。
QPicture picture;
picture.load("mypicture.pic");
QPainter painter(this);
painter.drawPicture(0,0,picture);//在(0,0)處重放繪圖指令,也可使用QPicture::play()完成相同的功能
===================================================================================
使用畫筆
畫筆的屬性包括線型,線寬,顏色等。畫筆的屬性能夠在構造函數中指定,也可使用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
---------------
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 和上一條規則的效果相似,但對比對較低一些,繪製白色將致使反轉成目git