138-QPainter和Graphics/View绘图-QPainter绘图-绘制图像

绘制图像

除了可以直接绘制几何图形外,QPainter 还可以把QPixmapQImage和QPicture图像直接绘制在绘图设备上。

绘制 QPixmap 图像的方法如表所示,可以将图像按照原始尺寸显示,也可以缩放图像到一个矩形区域中显示,还可以从原图像上截取一部分绘制到一个矩形区域。

用drawPixmapFragments(fragments; List[QPainter,PixmapFragment],fragmentCount:int,pixmap: Union[QPixmap,Qlmage,str],hints: QPainter,PixmapFragmentHints)方法可以截取图像的多个区域,并对每个区域进行缩放、旋转操作

  • 其中参数 hints 只能取QPainter.OpaqueHint ;
  • 参数 QPainter,PixmapFragment 的创建方法是QPainter.PixmapFragment,create(pos; QPointF, sourceRect; QRectF, scaleX = 1, scaley = 1. rotation =0,opacity = 1)
    • 其中 pos 是图像绘制地点,
    • sourceRect 是截取的图像的部分区域,
    • scaleX和scaleY 是缩放比例,
    • rotation 是旋转角度,
    • opacity 是不透明度值
QPainter 绘制 QPixmap 图像的方法说 明
drawPixmap(p: Union[QPointF,QPoint,QPainterPath.Element],pm:Union[QPixmap,QImage,str])指定绘图设备上的一个点作为左上角,按 照图像原始尺寸显示
drawPixmap(x:int,y:int,pm:Union[QPixmap,QImage,str])指定绘图设备上的一个点作为左上角,按 照图像原始尺寸显示
drawPixmap(r:QRect,pm:Union[QPixmap,Qlmage,str])指定绘图设备上的矩形区域,以缩放尺寸 方式显示
drawPixmap(x:int,y:int,w:int,h:int,pm:Union[QPixmap,QImage,str])指定绘图设备上的矩形区域,以缩放尺寸 方式显示
drawPixmap(p:Union[QPointF,QPoint,QPainterPath.Element],pm:Union[QPixmap,QImage,str],sr:Union[QRectF,QRect])指定绘图设备上的一个点和图像的矩形区 域,裁剪显示图像
drawPixmap(x:int,y:int,pm:Union[QPixmap,QImage,str],sx:int,sy:int,sw:int,sh:int)指定绘图设备上的一个点和图像的矩形区 域,裁剪显示图像
drawPixmap(targetRect: Union[QRectF,QRect],pixmap: Union[QPixmap,QImage,str],sourceRect: Union[QRectF,QRect])指定绘图设备上的矩形区域和图像的矩形 区域,裁剪并缩放显示图像
drawPixmap(x:int,y: int,w:int,h:int,pm: Union[QPixmap,QImage,str],sx: int,sy:int,sw:int,sh:int)指定绘图设备上的矩形区域和图像的矩形 区域,裁剪并缩放显示图像
drawTiledPixmap(QRect,Union[QPixmap,QImage,str],pos: QPoint)以平铺样式绘制图片
drawTiledPixmap(rect: Union[QRectF,QRect],pm: Union[QPixmap,QImage,str],offset: Union[QPointF,QPoint,QPainterPath.Element])以平铺样式绘制图片
drawTiledPixmap(x:int,y: int,w:int,h: int,Union[QPixmap,QImage,str],sx:int=0,sy:int=0)以平铺样式绘制图片
drawPixmapFragments(fragments: List[QPainter.PixmapFragment],fragmentCount: int,pixmap: Union[QPixmap,QImage,str],hints: QPainter.PixmapFragmentHints)绘制图像的多个部分,可以对每个部分进 行缩放、旋转操作

绘制 QImage 图像的方法如表所示。可以将图像按照原始尺寸显示,也可以缩放图像到一个矩形区域中显示,还可以从原图像上截取一部分绘制到一个矩形区域。

其中flags 参数是 Qt.ImageConversionFlags 枚举值,可取

  • Qt.AutoColor
  • Qt.ColorOnly
  • Qt.MonoOnly
QPainter绘制QImage图像的方法说明
drawImage(p: Union[QPointF,QPoint,QPainterPath,Element],image:Union[QImage,str])在指定位置,按图像实际尺寸显示
drawImage(r: Union[QRectF,QRect],image:Union[QImage,str])在指定矩形区域内,图像进行缩放显示
drawImage(p: Union[QPointF,QPoint,QPainterPath.Element],image:Union[Qlmage,str],sr: Union[QRectF,QRect],flags: Qt.ImageConversionFlags=Qt.AutoColor)在指定位置,从图像上截取一部分显示
drawImage(x: int,y: int,image: Union[QImage,str],sx:int=0,sy:int=0,sw:int=-1,sh: int= -1,flags: Qt.ImageConversionFlags= Qt.AutoColor)drawImage(targetRect:Union[QRectF,QRect],
image: Union[QImage,str],sourceRect: Union[QRectF,QRect],flags: Qt.ImageConversionFlags= Qt.AutoColor)-从图像上截取一部分,以缩放形式显示在指定 的矩形区域内

对于QPicture 图像,只能在绘图设备的指定点上按照原始尺寸进行绘制。

绘制QPicture 图像的方法有 drawPicture(p;Union[QPointF,QPoint,QPainterPath,Element]picture: Union[QPicture,int])和 drawPicture(x; int,y: int,picture: Union[QPictureint])

下面的程序从磁盘图片文件上创建QPixmap然后以QPixmap作为绘图设备直接在图片上绘制一个矩形和一个椭圆,并在矩形和椭圆之间填充黑色最后在窗口上绘制出图像。把图形先绘制到QPixmap或QImage图像中,然后再把QPixmap或QImage图像绘制到窗体上,可以避免出现屏幕闪烁现象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYRxW9Ei-1688476309146)(C:\Users\Hi\AppData\Roaming\Typora\typora-user-images\image-20230308154426968.png)]

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/8 15:30
# File_name: 08-绘制QPicture 图.py


from PySide6.QtWidgets import QApplication,QWidget,QGraphicsWidget
from PySide6.QtGui import QPainter,QPixmap,QPainterPath,QBrush
from PySide6.QtCore import QRectF,Qt
import sys,os


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()# 未确定绘图设备
        rect = QRectF(0,0,self.__pixmap.width(),self.__pixmap.height())# 获取图片的矩形

        path = QPainterPath()# 绘图路径
        path.addRect(rect)# 添加矩形
        path.addEllipse(rect)# 添加椭圆
        path.setFillRule(Qt.OddEvenFill)# 设道填充方式
        brush = QBrush(Qt.SolidPattern)# 画刷
        brush.setColor(Qt.black)# 画刷颜色

        painter.begin(self.__pixmap)# 以QPixmap作为绘图设备
        painter.setBrush(brush)# 设置画刷
        painter.setRenderHint(QPainter.Antialiasing)# 抗锯齿
        painter.drawPath(path)# 在QPixmap上绘图
        painter.end()# 结束绘图

        # 保存图像
        # if not os.path.exists("new.png"):
        #     self.__pixmap.save("new.png")

        painter.begin(self)# 以窗口作为位图设备
        painter.drawPixmap(self.rect(),self.__pixmap)# 在窗口上绘制图像
        painter.end()# 结束绘图


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()

    win.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

士别三日,当挖目相待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值