Qt 之 QPixmap
1 QPixmap 简介
QPixmap
类是一种 off-screen 图像表示形式,可以用作绘画设备。使用QLabel
或QAbstractButton
的子类之一(例如QPushButton
和QToolButton
),可以轻松地在屏幕上显示QPixmap
。QLabel
具有pixmap
属性,而QAbstractButton
具有icon
属性。
由于QPixmap
类使用隐式数据共享,因此可以按值传递QPixmap
对象。有关更多信息,请参见隐式数据共享(Implicit Data Sharing)文档。QPixmap
对象也可以流式传输。
请注意,pixmap 中的像素数据是内部的,并由基础窗口系统管理。由于QPixmap
是QPaintDevice
子类,因此QPainter
可用于直接绘制到 pixmap 上。只能通过QPainter
函数或将QPixmap
转换为QImage
来访问像素。但是,fill()
函数可用于以给定的颜色初始化整个像素图。
有一些函数可以在QImage
和QPixmap
之间进行转换。通常,在将QImage
对象转换为要在屏幕上显示的QPixmap
之前,使用QImage
类加载图像文件,并选择处理图像数据。或者,如果不需要任何操作,则可以将图像文件直接加载到QPixmap
中。
QPixmap
提供了一组函数,这些函数可用于获取有关像素图的各种信息。另外,有几个函数可以转换像素图。
2 使用 QPixmap
从给定fileName
的文件构造一个 pixmap。如果文件不存在或格式未知,则像素图将成为空像素图(null pixmap)。加载程序尝试使用指定的format
读取像素图。如果未指定format
(默认设置),则加载程序会在文件中探测标头以猜测文件格式。文件名可以引用磁盘上的实际文件,也可以引用应用程序的嵌入式资源之一。 有关如何在应用程序的可执行文件中嵌入图像和其他资源文件的详细信息,请参见Resource System。
如果需要修改图像以适应较低分辨率的结果(例如,从32位转换为8位),请使用flags
来控制转换。
fileName
,format
和flags
参数传递给load()
。这意味着fileName
中的数据未编译为二进制文件。如果fileName
包含相对路径(例如,仅文件名),则必须找到相对于运行时工作目录的相关文件。
使用给定的width
和height
构造一个像素图。如果width
或height
为零,则构造一个空的像素图。警告:这将创建一个带有未初始化数据的 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()
是一个重载函数。此函数使用指定的图像文件 format
和 quality
因数将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 ,否则返回False 。hasAlpha() ,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()
。
要将QPixmap
与HICON
相互转换,可以分别使用QtWinExtras
函数QtWin::toHICON()
和QtWin::fromHICON()
。
6 Pixmap Transformations
QPixmap
支持许多用于创建新 pixmap 的功能,该新 pixmap 是原始 pixmap 的转换(transformed)版本:scaled()
,scaledToWidth()
和scaledToHeight()
函数返回像素图的缩放副本,而copy()
函数创建的QPixmap
是原始像素图的纯副本。
scaled()
返回根据给定的AspectRatioMode
和transformMode
缩放为具有给定 width
和 height
的矩形的像素图的副本。
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
实例)。 此操作非常快,并且永远不会失败。