Qt 之 QPixmap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 之 QPixmap相关的知识,希望对你有一定的参考价值。

参考技术A 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 提供了一组函数,这些函数可用于获取有关像素图的各种信息。另外,有几个函数可以转换像素图。

从给定 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 :

效果:

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

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

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

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

效果:

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

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

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

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

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

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

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

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

要将 QPixmap 与 HICON 相互转换,可以分别使用 QtWinExtras 函数 QtWin::toHICON() 和 QtWin::fromHICON() 。

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

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

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

以上是关于Qt 之 QPixmap的主要内容,如果未能解决你的问题,请参考以下文章

QT征程之初识qt

Qt之界面实现技巧

QT之二级菜单(二级菜单的箭头可以使用QSS设置图片)

Qt 之 QImage

Qt 之 QBitmap

Qt添加驱动——Qt数据库之添加MySQL驱动插件