Qt QPainter CompositionMode解读及图片透明度设置
生活随笔
收集整理的這篇文章主要介紹了
Qt QPainter CompositionMode解读及图片透明度设置
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 前言
- 研究相關(guān)
- QPainter::CompositionMode
- QPainter::CompositionMode_SourceOver
- QPainter::CompositionMode_Source
- QPainter::CompositionMode_DestinationIn
- QPainter::CompositionMode_DestinationOut
- 調(diào)節(jié)圖片透明度
- 畫板橡皮擦
- 寫在最后
前言
Qt的QPainter十分強(qiáng)大,設(shè)置不同的組合模式,可以得到迥然不同的結(jié)果,比如調(diào)節(jié)圖片的透明度等,因此是否有必要弄清除QPainter的組合模式代表的意義。
研究相關(guān)
- Source指的是繪制的輸入,Destination指的是目的繪制區(qū)域本來存在的像素。
- 本文使用"Compositon Modes"程序?qū)Painter的組合模式進(jìn)行解讀,其中花是繪制區(qū)域原來存在的像素,橢圓是繪制的輸入,Circle color是橢圓的的RGB通道數(shù)值,circle alpha是橢圓的透明通道數(shù)值。
QPainter::CompositionMode
QPainter::CompositionMode_SourceOver
- Qt幫組文檔描述:This is the default mode. The alpha of the source is used to blend the pixel on top of the destination.
- SourceOver是默認(rèn)的繪制模式,繪制結(jié)果 = 繪制輸入*ratio_source + 目的區(qū)域原來像素 * ratio_destination。ratio_source和ratio_destination取決于繪制輸入的alpha通道值與繪制區(qū)域的alpha通道數(shù)值的比值(大部分取決于繪制區(qū)域的alpha數(shù)值,關(guān)系不是線性)。
- 測試數(shù)據(jù)
| (255, 255, 255, 10) | (0, 0, 0, 100) | (14, 14, 14, 102) |
| (255, 255, 255, 10) | (0, 0, 0, 200) | (3,3,3,202) |
| (255, 255, 255, 10) | (0, 0, 0, 255) | (0, 0, 0, 255) |
| (255, 255, 255, 255) | (100, 0, 0, 200) | (133, 55, 55, 255) |
| (255, 255, 255, 0) | (0, 0, 0, 200) | (0, 0, 0, 200) |
QPainter::CompositionMode_Source
- Qt幫組文檔描述:The output is the source pixel. (This means a basic copy operation and is identical to SourceOver when the source pixel is opaque).
- Source模式:繪制結(jié)果 = 繪制輸入,目的繪制區(qū)域原來的像素被完全覆蓋。
- 當(dāng)繪制輸入的Alpha通道為255(不透明時(shí)),Source和SourceOver模式的表現(xiàn)相同,因?yàn)镾ourceOver模式中ratio_source = 1,ratio_destination = 0;
QPainter::CompositionMode_DestinationIn
- Qt幫組文檔描述:The output is the destination, where the alpha is reduced by that of the source. This mode is the inverse of CompositionMode_SourceIn.
- DestinationIn模式,最后的繪制結(jié)果為原繪制區(qū)域圖像,但是其alpha通道數(shù)值會(huì)受到輸入的影響。
- 繪制結(jié)果 = 區(qū)域原像素(除Alpha通道外) + 區(qū)域原像素(Alpha通道)* 繪制輸入(Alpha通道)/ 255,繪制輸入(除Alpha通道)的值被丟棄,因此該模式一般僅用于設(shè)置繪制區(qū)域的透明度。
- 繪制結(jié)果通過代碼測試出來
- x = 200; 輸出為1325400063(4EFFFFFF),Alpha通道值為78(0x4E),而100 * (200/255) = 78.4313;
- x = 100;輸出為671088639(27FFFFFF),Alpha通道為39(0x27),而100 * (100/255) = 39.6825
- 測試代碼QImage temp(QSize(100, 100), QImage::Format_ARGB32); temp.fill(QColor(255, 255, 255, 100)); QPainter painter(&temp); painter.setCompositionMode(QPainter::CompositionMode_DestinationIn); painter.fillRect(temp.rect(), QColor(0, 0, 0, x)); painter.end(); qDebug() << temp.pixel(50, 50);
- 繪制結(jié)果通過代碼測試出來
QPainter::CompositionMode_DestinationOut
- Qt幫組文檔描述:The output is the destination, where the alpha is reduced by the inverse of the source. This mode is the inverse of CompositionMode_SourceOut.
- DestinationOut模式,最后的繪制結(jié)果為原繪制區(qū)域圖像,但是其alpha透明通道數(shù)值會(huì)受到輸入alpha透明通道取反值的影響。
- 繪制結(jié)果 = 區(qū)域原像素(除Alpha通道外) + 區(qū)域原像素(Alpha通道)* (255 - 繪制輸入(Alpha通道))/ 255,繪制輸入(除Alpha通道)的值被丟棄,因此該模式一般僅用于設(shè)置繪制區(qū)域的透明度。
| (255, 255, 255, 200) | (255, 255, 255, 127) | (255, 255, 255, 100) |
| (255, 255, 255, 100) | (255, 255, 255, 127) | (255, 255, 255, 50) |
| (255, 255, 255, 50) | (255, 255, 255, 127) | (255, 255, 255, 25) |
| (255, 255, 255, 25) | (255, 255, 255, 127) | (255, 255, 255, 13) |
| (255, 255, 255, 13) | (255, 255, 255, 127) | (255, 255, 255, 7) |
| (255, 255, 255, 7) | (255, 255, 255, 127) | (255, 255, 255, 4) |
| (255, 255, 255, 4) | (255, 255, 255, 127) | (255, 255, 255, 2) |
| (255, 255, 255, 2) | (255, 255, 255, 127) | (255, 255, 255, 1) |
| (255, 255, 255, 1) | (255, 255, 255, 127) | (255, 255, 255, 1) |
- 從測試數(shù)據(jù)中不難看出,該模式可以用作畫板的橡皮檫,多次擦除后,最后殘留的像素必為(x, x, x, 1),顯示出來的結(jié)果近似與空白,而又不會(huì)破壞畫板。
- 需要注意的是,橡皮檫的透明通道最大為127,否則將穿透畫板(最后的像素透明通道為0),因?yàn)榇笥?27,則有(255 - 127)/255 < 0.5,多次擦除后透明通道將為0。
調(diào)節(jié)圖片透明度
/* 最后生成的img_res是img圖片的透明復(fù)制 */QPixmap temp(this->img.size()); temp.fill(Qt::transparent);QPainter p1(&temp); // CompositionMode_Source將圖片繪制進(jìn)去 p1.setCompositionMode(QPainter::CompositionMode_Source); p1.drawPixmap(0, 0, this->img); // CompositionMode_DestinationIn設(shè)置圖片的透明度 p1.setCompositionMode(QPainter::CompositionMode_DestinationIn); // 根據(jù)QColor中第四個(gè)參數(shù)設(shè)置透明度,此處position的取值范圍是0~255 p1.fillRect(temp.rect(), QColor(0, 0, 0, this->transparency * 255/100)); p1.end();this->img_res = temp.copy();畫板橡皮擦
QPainter p1(&temp); p1.setPen(QPen(QColor(255, 255, 255, 127),pen_thickness + 10,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin)); p1.setCompositionMode(QPainter::CompositionMode_DestinationOut); p1.drawLine(start_pos, end_pos);寫在最后
- 目前只列舉了常見的三種CompositionMode,這三種模式可以用于調(diào)節(jié)圖片的透明度。后續(xù)將繼續(xù)補(bǔ)充。
- 20200328更新:加入CompositionMode_DestinationOut模式的解讀。
總結(jié)
以上是生活随笔為你收集整理的Qt QPainter CompositionMode解读及图片透明度设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 日历和计算器命令
- 下一篇: 全球与中国数据标注软件市场深度研究分析报