Qt 之 QPixmap

2020-08-12  本文已影响0人  水之心

1 QPixmap 简介

QPixmap类是一种 off-screen 图像表示形式,可以用作绘画设备。使用QLabelQAbstractButton的子类之一(例如QPushButtonQToolButton),可以轻松地在屏幕上显示QPixmapQLabel具有pixmap属性,而QAbstractButton具有icon属性。

由于QPixmap类使用隐式数据共享,因此可以按值传递QPixmap对象。有关更多信息,请参见隐式数据共享(Implicit Data Sharing)文档。QPixmap对象也可以流式传输。

请注意,pixmap 中的像素数据是内部的,并由基础窗口系统管理。由于QPixmapQPaintDevice子类,因此QPainter可用于直接绘制到 pixmap 上。只能通过QPainter函数或将QPixmap转换为QImage来访问像素。但是,fill()函数可用于以给定的颜色初始化整个像素图。

有一些函数可以在QImageQPixmap之间进行转换。通常,在将QImage对象转换为要在屏幕上显示的QPixmap之前,使用QImage类加载图像文件,并选择处理图像数据。或者,如果不需要任何操作,则可以将图像文件直接加载到QPixmap中。

QPixmap提供了一组函数,这些函数可用于获取有关像素图的各种信息。另外,有几个函数可以转换像素图。

2 使用 QPixmap

从给定fileName的文件构造一个 pixmap。如果文件不存在或格式未知,则像素图将成为空像素图(null pixmap)。加载程序尝试使用指定的format读取像素图。如果未指定format(默认设置),则加载程序会在文件中探测标头以猜测文件格式。文件名可以引用磁盘上的实际文件,也可以引用应用程序的嵌入式资源之一。 有关如何在应用程序的可执行文件中嵌入图像和其他资源文件的详细信息,请参见Resource System

如果需要修改图像以适应较低分辨率的结果(例如,从32位转换为8位),请使用flags来控制转换。

fileNameformatflags参数传递给load()。这意味着fileName中的数据未编译为二进制文件。如果fileName包含相对路径(例如,仅文件名),则必须找到相对于运行时工作目录的相关文件。

使用给定的widthheight构造一个像素图。如果widthheight为零,则构造一个空的像素图。警告:这将创建一个带有未初始化数据的 QPixmap。调用fill()以用适当的颜色填充像素图,然后使用QPainter对其进行绘制。

下面以 QLabel 为例子说明如何使用 QPixmap

from xinet import QtWidgets, QtCore, QtGui
from xinet.run_qt import run


class Image(QtWidgets.QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 创建一个空的 pixmap, 并设定其尺寸
        self.pix = QtGui.QPixmap(300, 300)  # 默认填充颜色为黑色
        self.pix.fill('red') # 修改填充颜色为红色
        self.setPixmap(self.pix) # 设定 QLabel 的 pixmap


if __name__ == '__main__':
    run(Image)

效果:

3 读取和写入图像文件

QPixmap提供了几种读取图像文件的方式:构造QPixmap对象时可以加载该文件,或者稍后使用load()loadFromData()函数来加载该文件。加载图像时,文件名可以引用磁盘上的实际文件,也可以引用应用程序的嵌入式资源之一。有关如何在应用程序的可执行文件中嵌入图片和其他资源文件的详细信息,请参见 Qt资源系统概述

只需调用save()函数即可保存QPixmap对象。

可通过supportedImageFormats()supportedImageFormats()函数获得受支持文件格式的完整列表。可以将新文件格式添加为插件。默认情况下,Qt支持以下格式:

格式 描述 Qt 支持
BMP Windows Bitmap 读/写
GIF Graphic Interchange Format (optional)
JPG/JPEG Joint Photographic Experts Group 读/写
PNG Portable Network Graphics 读/写
PBM Portable Bitmap
PGM Portable Graymap
PPM Portable Pixmap 读/写
XBM X11 Bitmap 读/写
XPM X11 Pixmap 读/写

3.1 载入图片

使用 load() 从给定fileName的文件中加载像素图。如果成功加载了像素图,则返回 True;否则会使像素图无效并返回 False

from xinet import QtWidgets, QtCore, QtGui
from xinet.run_qt import run


class Image(QtWidgets.QLabel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.pix = QtGui.QPixmap()
        # 载入图片,如果成功加载了像素图,则返回`True`;否则会使像素图无效并返回 `False`
        self.pix.load('test.jpg') 
        self.setPixmap(self.pix)


if __name__ == '__main__':
    run(Image)

效果:

请注意,从主线程中的文件加载时,QPixmap 会自动添加到 QPixmapCache 中。使用的 key 是内部密钥,无法获取。

loadFromData() 从给定二进制数据的 len 个前字节加载 pixmap。如果成功加载了像素图,则返回 true;否则会使像素图无效并返回 false。

3.2 保存图片

save() 是一个重载函数。此函数使用指定的图像文件 formatquality 因数将QPixmap写入给定device。例如,这可以用于将像素图直接保存到QByteArray中:

pixmap = QPixmap()
byte_array = QtCore.QByteArray()
buffer = QtCore.QBuffer(byte_array)
buffer.open(QtCore.QIODevice.WriteOnly)
pixmap.save(buffer, "PNG") # writes pixmap into bytes in PNG format

4 Pixmap 信息

QPixmap提供了一组函数,这些函数可用于获取有关 pixmap 的各种信息:

概述 可能的函数
Geometry size()width()height()函数提供有关 pixmap 大小的信息。rect()函数返回图像的 enclosing 矩形。
Alpha component 如果 pixmap 具有 alpha 通道的格式,则hasAlphaChannel()返回True,否则返回FalsehasAlpha()setMask()mask()函数是旧函数,因此不应使用。它们可能非常慢。createHeuristicMask()函数为 pixmap 创建并返回一个 1-bpp 的启发式掩码(heuristic mask,即QBitmap)。它的工作原理是从任一角中选择一种颜色,然后从所有边缘开始切去该颜色的像素。createMaskFromColor()函数根据给定的颜色为 pixmap 创建并返回一个掩码(即QBitmap)。
Low-level information depth()函数返回像素图的深度。defaultDepth()函数返回默认深度,即应用程序在给定屏幕上使用的深度。cacheKey()函数返回一个数字,该数字唯一标识QPixmap对象的内容。

createHeuristicMask([clipTight=true]) 创建并返回此像素图的启发式蒙版。该功能的工作原理是从任一角中选择一种颜色,然后从所有边缘开始切去该颜色的像素。 如果clipTight为true(默认值),则遮罩足够大以覆盖像素; 否则,掩码大于数据像素。

遮罩(mask)可能并不完美,但应该合理,因此您可以执行以下操作:

myPixmap = QPixmap()
myPixmap.setMask(myPixmap.createHeuristicMask())

此函数很慢,因为它涉及到QImage的转换以及非平凡的计算。可参考:createHeuristicMask()createMaskFromColor()

5 Pixmap Conversion

可以使用toImage()函数将QPixmap对象转换为QImage。同样,可以使用fromImage()QImage转换为QPixmap。如果此操作过于昂贵,则可以改用fromImage()

要将QPixmapHICON相互转换,可以分别使用QtWinExtras函数QtWin::toHICON()QtWin::fromHICON()

6 Pixmap Transformations

QPixmap支持许多用于创建新 pixmap 的功能,该新 pixmap 是原始 pixmap 的转换(transformed)版本:scaled()scaledToWidth()scaledToHeight()函数返回像素图的缩放副本,而copy()函数创建的QPixmap是原始像素图的纯副本。

scaled() 返回根据给定的AspectRatioModetransformMode缩放为具有给定 widthheight 的矩形的像素图的副本。

scaledToWidth()scaledToHeight() 使用方法类似于scaled()

copy() 返回由矩形QRect ( x , y , width , height ) 指定的像素图子集的深层副本:

transformd()函数返回使用给定的转换矩阵和转换模式转换的像素图的副本:在内部,调整转换矩阵以补偿不需要的平移,即transform()返回包含原始像素图的所有转换点的最小像素图。 静态trueMatrix()函数返回用于转换像素图的实际矩阵。

下列图像处理类也支持 Transformations 中的这些函数:

QBitmap QImage QImageReader QImageWriter

7 其他函数

PySide2.QtGui.QPixmap.isNull() 如果这是一个空的像素图,则返回 true;否则返回 false。

PySide2.QtGui.QPixmap.swap(other)用此像素图交换 other(即 QPixmap 实例)。 此操作非常快,并且永远不会失败。

上一篇下一篇

猜你喜欢

热点阅读