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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Graphics View 是 Qt 框架中用于绘图的一个模块。下面是一个使用 Graphics View 绘制简单图形的示例程序。 首先,需要在程序中引入 QGraphicsView、QGraphicsScene 和 QGraphicsItem 这三个类的头文件。 然后,在程序的主函数或其他适当的位置,创建一个 QGraphicsView 实例,并设置场景的大小和背景颜色。例如: QGraphicsView *view = new QGraphicsView(); view->setSceneRect(0, 0, 800, 600); view->setBackgroundBrush(Qt::white); 接着,创建一个 QGraphicsScene 实例,并设置场景的大小和背景颜色。例如: QGraphicsScene *scene = new QGraphicsScene(); scene->setSceneRect(0, 0, 800, 600); scene->setBackgroundBrush(Qt::white); 然后,创建一个 QGraphicsItem 的子类,并实现它的绘制函数 paint()。在 paint() 函数中,使用 QPainter 绘制所需的图形,如圆形、矩形等。例如: class MyGraphicsItem : public QGraphicsItem { public: MyGraphicsItem() {} QRectF boundingRect() const override { return QRectF(-50, -50, 100, 100); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { painter->setBrush(Qt::blue); painter->drawEllipse(-50, -50, 100, 100); } }; 最后,将创建的 MyGraphicsItem 添加到场景中,并将场景设置给 QGraphicsView 实例。例如: MyGraphicsItem *item = new MyGraphicsItem(); scene->addItem(item); view->setScene(scene); view->show(); 整个程序的执行过程是,创建一个 QGraphicsView 实例,并设置它的场景为一个 QGraphicsScene 实例。然后,在 QGraphicsScene 中创建一个 QGraphicsItem 的子类,实现绘制函数 paint()。最后,将这个 QGraphicsItem 添加到 QGraphicsScene 中,从而在 QGraphicsView 中显示出来。 这个示例只是 Graphics View 的基础用法,真实的 Graphics View 应用程序会更加复杂,可以通过修改 MyGraphicsItem 的 paint() 函数来实现更多的绘图操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值