142-QPainter和Graphics/View绘图-QPainter绘图-图形合成

图形合成

图形合成是指当绘制新图形时,绘图设备上已经存在旧图形,对新图形和旧图形进行处理的方法。

图形合成是基于像素,将旧图形的颜色值和 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 表示旧图形。

      image-20230308175426672

下面所示绘图程序先绘制一个图片,再用绘图路径添加矩形和一个椭圆,在矩形和椭圆之间填充黑色。采用QPainter.CompositionMode_SourceOver 合成方式将两个图形合成后的效果如图所示。

image-20230308175150289

# -*- 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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值