图形合成
图形合成是指当绘制新图形时,绘图设备上已经存在旧图形,对新图形和旧图形进行处理的方法。
图形合成是基于像素,将旧图形的颜色值和 Alpha 通道的值与新图形的颜色值和Alpha 通道的值进行合成处理。
-
图形合成的处理使用QPainter 的 setCompositionMode(mode:QPainter.CompositionMode)方法设置,
-
用compositionMode()方法获取合成模式其中参数 mode是QPainter,CompositionMode 的举值,常用的几个取值如表所示,默认值是QPainter.CompositionMode_SourceOver。
QPainter.CompositionMode的常用取值 说明 QPainter.CompositionMode_SourceOver 这是默认模式。源的alpha用于混合目标顶部的像素。 QPainter.CompositionMode_Source 输出是源像素。(这意味着基本的复制操作,当源像素不透明时,与SourceOver相同)。 QPainter.CompositionMode_Destination 输出是目标像素。这意味着混合没有效果。此模式与CompositionMode_Source相反。 QPainter.CompositionMode_DestinationOver 目标的alpha用于将其混合在源像素的顶部。此模式与CompositionMode_SourceOver相反。 QPainter.CompositionMode_SourceIn 输出是源,其中alpha减去目标的alpha。 QPainter.CompositionMode_DestinationIn 输出是目的地,其中alpha减少了源的alpha。此模式与CompositionMode_SourceIn相反。 QPainter.CompositionMode_SourceOut 输出是源,其中alpha减少目标的倒数。 QPainter.CompositionMode_DestinationOut 输出是目的地,其中alpha减少了源的倒数。此模式与CompositionMode_SourceOut相反。 QPainter.CompositionMode_SourceAtop 源像素在目标像素的顶部混合,源像素的alpha减去目标像素的alpha。 QPainter.CompositionMode_DestinationAtop 目标像素在源的顶部混合,目标像素的alpha值减去目标像素的alpha值。此模式与CompositionMode_SourceAtop相反。 QPainter.CompositionMode_Clear 目标中的像素被清除(设置为完全透明),与源无关。 QPainter.CompositionMode_Xor 源(其alpha与目标alpha的倒数减小)与目标(其alpha减小源alpha的倒数)合并。CompositionMode_Xor与按位Xor不同。 QPainter.CompositionMode_Plus 源像素和目标像素的alpha和颜色都添加在一起。 QPainter.CompositionMode_Multiply 输出是源颜色乘以目标颜色。将颜色与白色相乘会使颜色保持不变,而将颜色与黑色相乘会产生黑色。 QPainter.CompositionMode_Screen 源颜色和目标颜色被反转,然后相乘。用白色屏蔽颜色会产生白色,而用黑色屏蔽颜色会使颜色保持不变。 QPainter.CompositionMode_Overlay 根据目标颜色倍增或屏蔽颜色。目的地颜色与源颜色混合,以反映目的地的明度或暗度。 QPainter.CompositionMode_Darken 选择源颜色和目标颜色中较深的颜色。 QPainter.CompositionMode_Lighten 选择源颜色和目标颜色中的较浅颜色。 QPainter.CompositionMode_ColorDodge 目标颜色变亮以反映源颜色。黑色源颜色保持目标颜色不变。 QPainter.CompositionMode_ColorBurn 目标颜色变暗以反映源颜色。白色源颜色保持目标颜色不变。 QPainter.CompositionMode_HardLight 根据源颜色倍增或屏蔽颜色。光源颜色将使目标颜色变亮,而暗光源颜色将变暗目标颜色。 QPainter.CompositionMode_SoftLight 根据源颜色使颜色变暗或变亮。类似于CompositionMode_HardLight。 QPainter.CompositionMode_Difference 从较亮的颜色中减去较暗的颜色。使用白色绘制将反转目标颜色,而使用黑色绘制将保持目标颜色不变。 QPainter.CompositionMode_Exclusion 类似于CompositionMode_Difference,但对比度较低。使用白色绘制将反转目标颜色,而使用黑色绘制将保持目标颜色不变。 QPainter.RasterOp_SourceOrDestination 对源像素和目标像素执行逐位OR运算(src OR dst)。 QPainter.RasterOp_SourceAndDestination 对源像素和目标像素执行逐位AND运算(src AND dst)。 QPainter.RasterOp_SourceXorDestination 对源像素和目标像素执行逐位XOR运算(src XOR dst)。 QPainter.RasterOp_NotSourceAndNotDestination 对源像素和目标像素((Not src)and(Not dst))执行逐位NOR操作。 QPainer.RasterOp_NotSource或NotDestination 对源像素和目标像素执行逐位"与非"运算((Not src)OR(Not dst))。 QPainter.RasterOp_NotSourceXorDestination 执行逐位操作,其中源像素被反转,然后与目标像素进行异或运算((Not src)XOR dst)。 QPainter.RasterOp_NotSource 在源像素反转的情况下执行逐位操作(Not src)。 QPainter.RasterOp_NotSourceAndDestination 执行逐位操作,其中源被反转,然后与目标进行"与"运算((Not src)and dst)。 QPainter.RasterOp_SourceAndNotDestination 执行逐位操作,其中源与反转的目标像素进行"与"运算(src AND(Not dst))。 QPainter.RasterOp_NotSourceOrDestination 执行逐位操作,其中源被反转,然后与目标进行"或"运算((Not src)OR dst)。 QPainter.RasterOp_ClearDestination 目标中的像素被清除(设置为0),与源无关。 QPainter.RasterOp_SetDestination 目标中的像素设置(设置为1)与源无关。 QPainter.RasterOp_NotDestination 执行目标像素反转(Not dst)的逐位操作。 QPainter.RasterOp_SourceOrNotDestination 执行逐位运算,其中源与反转的目标像素进行"或"运算(src OR(Not dst))。 -
这几种取值的效果如图所示其中Source表示新绘制的图形,Destination 表示旧图形。
-
下面所示绘图程序先绘制一个图片,再用绘图路径添加矩形和一个椭圆,在矩形和椭圆之间填充黑色。采用QPainter.CompositionMode_SourceOver 合成方式将两个图形合成后的效果如图所示。
# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/8 17:43
# File_name: 13-图形合成实例.py
import sys
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtGui import QPainter,QPixmap,QPainterPath,QBrush
from PySide6.QtCore import QRectF,Qt
class MyWindow(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.resize(600,500)
self.__pixmap = QPixmap("../../Resources/Images/正方形.png")
def paintEvent(self,event):
painter = QPainter(self)
painter.drawPixmap(self.rect(),self.__pixmap)# 绘制图片
rect = QRectF(0,0,self.width(),self.height())# 获取窗口的矩形
path = QPainterPath()# 绘图路径
path.addRect(rect)# 添加短形
path.addEllipse(rect)# 添加椭圆
path.setFillRule(Qt.FillRule.OddEvenFill)# 设置填究方式
brush = QBrush(Qt.SolidPattern)# 画刷
brush.setColor(Qt.black)
painter.setBrush(brush)# 设登画刷
painter.setCompositionMode(QPainter.CompositionMode_SourceOver)# 设置图像合成方式
painter.drawPath(path)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec())