绘制图像
除了可以直接绘制几何图形外,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())