小白白也能学会的 PyQt 教程 —— 图像类及图像相关基础类介绍

简介: 图,貌似是一个好看的 UI 中必不可少的东西,精美的 UI 中不可避免的会使用一些奇特的各种图像元素来提升用户体验。对于开发者而言,如何在应用程序中有效地显示和处理图像成为一个重要的课题。在Python中,PyQt库是一个强大而灵活的选择,它提供了丰富的图像处理类和功能。PyQt中的图像类和组件使开发者能够加载、保存、绘制和转换图像,从而实现各种图像操作。其中,常用的图像类包括QPixmap、QImage和QIcon。QPixmap和QImage提供了基本的图像处理功能,可以加载、保存、缩放、剪裁和绘制图像。QIcon则用于在GUI应用程序中显示图标,可以加载图像文件并在按钮、菜单等控件上展

〇、前言

图,貌似是一个好看的 UI 中必不可少的东西,精美的 UI 中不可避免的会使用一些奇特的各种图像元素来提升用户体验。对于开发者而言,如何在应用程序中有效地显示和处理图像成为一个重要的课题。在Python中,PyQt库是一个强大而灵活的选择,它提供了丰富的图像处理类和功能。

PyQt中的图像类和组件使开发者能够加载、保存、绘制和转换图像,从而实现各种图像操作。其中,常用的图像类包括QPixmap、QImage和QIcon。QPixmap和QImage提供了基本的图像处理功能,可以加载、保存、缩放、剪裁和绘制图像。QIcon则用于在GUI应用程序中显示图标,可以加载图像文件并在按钮、菜单等控件上展示图标。

此外,PyQt还提供了其他一些与图像相关的类和组件,如QBrush、QPen和QPainter,它们可以帮助开发者实现更高级的图像操作,如填充样式、画笔样式以及绘制各种图形元素等。而使用QGraphicsView和QGraphicsScene组件可以实现更复杂的图形场景展示和交互,适用于绘图、图表和地图等应用领域。

通过PyQt提供的丰富图像类和组件,开发者可以轻松地在应用程序中展示精美的图像,提升用户界面的吸引力和可用性。无论是创建一个简单的图像展示功能,还是实现复杂的图形交互,PyQt都为开发者提供了强大而灵活的工具。在接下来的部分,我将简单介绍一下图像类及图像相关类,方便大家在学习的时候打开文章进行参考

一、PyQt 中的图像类

1、图像类简介

PyQt 中提供了许多用于处理图像的类和功能,来用于处理图像加载、保存、绘制和转换等操作。下面是PyQt中比较常用的图像类:

  1. QPixmap:用于处理图像的基本类。它可以加载、保存、缩放、剪裁和绘制图像。
  2. QImage:与QPixmap类似,也用于处理图像。它支持更多的图像格式和操作,包括像素级别的访问和修改。
  3. QIcon:用于在GUI应用程序中显示图标的类。它可以加载图像文件,并在按钮、菜单等控件上显示图标。
  4. QPicture:用于记录和重播绘图操作的类。它可以存储绘制图形的指令,然后在需要时进行重绘。
  5. QImageReader:用于读取不同格式的图像文件的类。它可以加载各种图像文件,并将其转换为QImage或QPixmap对象。
  6. QImageWriter:用于将图像写入不同格式的图像文件的类。它可以将QImage或QPixmap对象保存为各种图像文件。

此外,PyQt还提供了其他一些与图像相关的类和功能,它们提供了更多高级的图形处理功能,例如绘制、渲染、填充等。它们可以帮助你在PyQt应用程序中更灵活地处理和展示图像和图形元素:

  1. QBitmap:用于创建位图的类。它可以用于创建透明或非透明的图像,通常用于制作形状非矩形的控件。
  2. QBrush:用于描述绘画操作中的填充样式的类。它可以用于填充图形元素,如矩形、椭圆、多边形等。
  3. QPen:用于描述绘画操作中的画笔样式的类。它可以用于指定绘制图形边框的颜色、宽度、样式等。
  4. QPainter:用于绘制图形和图像的类。它提供了各种绘制图形元素的方法,如绘制直线、矩形、椭圆、文本等。
  5. QGraphicsView:用于显示和交互大型图形场景的类。它可以用于展示和操作复杂的图形,如绘图、图表、地图等。
  6. QOpenGLWidget:用于在GUI应用程序中显示OpenGL渲染的图形的类。它提供了与OpenGL集成的功能,可以显示和交互3D图形。

2、图像类转换

① 常用类转换(QPixmap、QImage、QIcon)

  1. QPixmap 转换为 QImage:
pixmap = QPixmap("image.png")  # 创建一个 QPixmap 对象
image = pixmap.toImage()  # 转换为 QImage 对象
  1. QImage 转换为 QPixmap:
image = QImage("image.png")  # 创建一个 QImage 对象
pixmap = QPixmap.fromImage(image)  # 转换为 QPixmap 对象
  1. QImage 转换为 QIcon:
image = QImage("image.png")  # 创建一个 QImage 对象
icon = QIcon(QPixmap.fromImage(image))  # 转换为 QIcon 对象
  1. QPixmap 转换为 QIcon:
pixmap = QPixmap("image.png")  # 创建一个 QPixmap 对象
icon = QIcon(pixmap)  # 转换为 QIcon 对象

这些是常见的一些类之间的转换示例。根据你的具体需求和使用情况,你可以根据需要进行适当的转换。值得注意的是,有些类之间的转换可能会引入一定的性能开销或图像数据的损失,因此在进行转换时要小心处理。

② QBitmap、QBrush、QPen 转换为 QPixmap 或 QImage

  1. QBitmap 转换为 QPixmap 或 QImage:
bitmap = QBitmap("bitmap.png")  # 创建一个 QBitmap 对象
pixmap = QPixmap.fromImage(bitmap.toImage())  # 将 QBitmap 转换为 QPixmap
image = bitmap.toImage()  # 将 QBitmap 转换为 QImage
  1. QBrush 转换为 QPixmap:
brush = QBrush(Qt.SolidPattern)  # 创建一个 QBrush 对象
pixmap = QPixmap(100, 100)  # 创建一个 QPixmap 对象
pixmap.fill(brush.color())  # 使用 QBrush 的颜色填充 QPixmap
  1. QPen 转换为 QPixmap 或 QImage:
pen = QPen(Qt.red)  # 创建一个 QPen 对象
pixmap = QPixmap(100, 100)  # 创建一个 QPixmap 对象
pixmap.fill(Qt.white)  # 填充 QPixmap
painter = QPainter(pixmap)
painter.setPen(pen)
painter.drawLine(0, 0, 100, 100)  # 在 QPixmap 上绘制线条
painter.end()
image = pixmap.toImage()  # 将 QPixmap 转换为 QImage

这些示例展示了一些其他类之间的转换方法。根据你的具体需求,你可以选择适当的方法来转换不同的图像类。记住,在进行转换时,你需要考虑数据格式、性能和目标类的要求。

③ QByteArray 与 QPixmap、QImage 的互转

  1. QPixmap 或 QImage 转换为 QByteArray:
pixmap = QPixmap("image.png")  # 创建一个 QPixmap 对象
byte_array = QByteArray()
buffer = QBuffer(byte_array)
buffer.open(QIODevice.WriteOnly)
pixmap.save(buffer, "PNG")  # 将 QPixmap 转换为 QByteArray
buffer.close()
# 或者
image = QImage("image.png")  # 创建一个 QImage 对象
byte_array = QByteArray()
buffer = QBuffer(byte_array)
buffer.open(QIODevice.WriteOnly)
image.save(buffer, "PNG")  # 将 QImage 转换为 QByteArray
buffer.close()
  1. QByteArray 转换为 QPixmap 或 QImage:
byte_array = QByteArray()
# 假设 byte_array 包含图像数据
pixmap = QPixmap()
pixmap.loadFromData(byte_array)  # 将 QByteArray 转换为 QPixmap
# 或者
image = QImage()
image.loadFromData(byte_array)  # 将 QByteArray 转换为 QImage

这些示例展示了如何在 QPixmap、QImage 和 QByteArray 之间进行转换。使用适当的方法,你可以实现图像数据的存储、加载和传输。请根据你的具体需求选择适合的转换方法。

④ numpy 与 QImage 互转

  1. QImage 转换为 numpy 数组:
image = QImage("image.png")  # 创建一个 QImage 对象
width = image.width()
height = image.height()
array = np.zeros([height, width, 4], dtype=np.uint8)  # 创建一个空的 numpy 数组
for y in range(height):
    for x in range(width):
        pixel = image.pixel(x, y)  # 获取像素值
        rgba = QColor(pixel).getRgb()  # 转换为 RGBA 值
        array[y, x] = rgba  # 将 RGBA 值存入 numpy 数组
  1. numpy 数组转换为 QImage:
array = np.zeros([100, 100, 4], dtype=np.uint8)  # 创建一个 numpy 数组
array[:, :, 0] = 255  # 将红色通道设置为 255
image = QImage(array.data, 100, 100, QImage.Format_RGBA8888)  # 将 numpy 数组转换为 QImage

这些示例展示了如何在 QImage 和 numpy 数组之间进行转换。转换为 numpy 后,可以更方便的进行深度学习。

二、图像显示组件

想要将图像显示出来,仅有上面这些图像类可不行,还需要一些组件将图像给显示出来。常用的组件有QLabel与QGraphiceView,这里将着重介绍这两个图像显示组件,并对其他的一些图像显示组件进行简单介绍。根据自己不同的需求以及场景,大家可以选择不同的组件来显示图像。

下面是一张分辨率超高的图,后面对图像显示的实验中,都将使用这张图片进行操作,大家可以比对这两张图,来感受不同组件之间的差异。

(图片分辨率 3637×2433,来自于 Pexels Ánh Đặng图片: https://www.pexels.com/zh-cn/photo/16392177/

1.jpeg

1、使用 QLabel 显示图像

QLabel 在我目前的认知中算是一个比较常见的组件,可以用来进行图像以及文字的显示,下面是一段使用 QLabel 显示图像的简单示例程序

from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap
app = QApplication([])
window = QWidget()
# 创建QLabel组件
label = QLabel(window)
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 设置图像为QLabel的内容
label.setPixmap(pixmap)
# 显示窗口
window.show()
app.exec_()

在上述代码中,我们创建了一个QLabel组件并将其添加到窗口中。然后,使用QPixmap加载图像文件,并使用setPixmap()方法将图像设置为QLabel的内容。最后,我们显示窗口并进入应用程序的事件循环。

然而,QLabel 在显示图片时并不完美,下图是上述代码使用QLabel 对一张上述比我屏幕还要大的图片进行显示的结果,可以看到 QLabel 在不进行任何操作的情况下,并不能将我的图片完全显示,只是显示了图片左上角的一部分。

2.png

下面是我使用 pixmap 的 scaled 方法对图像进行缩放后的代码以及图像,大家可以重新感觉一下:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QTransform
app = QApplication([])
window = QWidget()
# 创建QLabel组件
label = QLabel(window)
# 设置QLabel大小
label.setFixedSize(600, 400)
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 调整图像大小
scaled_pixmap = pixmap.scaled(600, 400, aspectRatioMode=Qt.KeepAspectRatio)
# 设置图像为QLabel的内容
label.setPixmap(scaled_pixmap)
# 显示窗口
window.show()
app.exec_()

3.png

2、使用 QGraphicsView 展示图像和图形场景

QGraphicsView是一个用于展示图像和图形场景的强大组件。它提供了对图像的缩放、平移和交互操作的支持。

from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
app = QApplication([])
view = QGraphicsView()
scene = QGraphicsScene()
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 在场景中添加图像
scene.addPixmap(pixmap)
# 设置场景为QGraphicsView的场景
view.setScene(scene)
# 设置图像居中显示
view.setAlignment(Qt.AlignCenter)
# 显示QGraphicsView组件
view.show()
app.exec_()

在上述代码中,我们创建了一个QGraphicsView组件和一个QGraphicsScene场景。使用QPixmap加载图像文件,然后将图像添加到场景中。接着,将场景设置为QGraphicsView的场景,并使用setAlignment()方法使图像居中显示。最后,显示QGraphicsView组件并进入应用程序的事件循环。

下面是图像显示的后果,可以看到,QGraphicsView与QLabel 在显示图像4.png时还是有一些区别的,我们从图中能看到的就比如QGraphics有一个滚动条,而QLabel没有;这主要是因为QGraphicsView提供了更高级的图形操作和交互功能,而QLabel更适合显示静态图像。


3、其他可用的图像显示组件和控件

常用的用来显示图像的方法主要就是 QLabel 与 QGraphicsView 组件,这两个组件已经能够满足大多数应用场景的需求,其他的一些也可以用来显示图像的组件或方法下面也就简单介绍一下,有特殊需求的小伙伴可以看一下:

① 使用QPainter绘制图像:

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QImage, QPainter
app = QApplication([])
window = QWidget()
image = QImage("image.jpg")  # 通过文件路径加载图像
image = image.scaled(600, 400, aspectRatioMode=Qt.KeepAspectRatio)  # 调整图像大小
def paintEvent(event):
    painter = QPainter(window)
    painter.drawImage(0, 0, image)  # 在指定位置绘制图像
window.paintEvent = paintEvent
window.show()
app.exec_()
5.png

② 使用QSS加载图片为窗口的背景:

from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication([])
window = QWidget()
window.setStyleSheet(   #QSS 加载图片
    "QWidget{border-image:url(image.jpg)}"
)
window.show()
app.exec_()

6.png

③ 使用QGraphicsPixmapItem显示图像

from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QGraphicsPixmapItem
app = QApplication([])
view = QGraphicsView()
scene = QGraphicsScene()
pixmap = QPixmap("image.jpg")  # 通过文件路径加载图像
item = QGraphicsPixmapItem(pixmap)
scene.addItem(item)
view.setScene(scene)
view.setAlignment(Qt.AlignCenter)
view.show()
app.exec_()

7.png

三、图像操作与转换

下面是一些使用 PyQt 方法图像进行操作和转换的简单实例,包括缩放、剪裁、旋转、调整亮度和对比度等。需要的可以参考使用。

1、缩放图像

缩放图像是调整图像尺寸的常见操作之一。PyQt提供了 scaled() 方法来实现图像的缩放。下面是一段实例代码:

from PyQt5.QtGui import QPixmap
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 缩放图像
scaled_pixmap = pixmap.scaled(800, 600)

8.png

2、剪裁图像

剪裁图像是根据指定的区域截取图像的操作。在PyQt中,你可以使用 copy() 方法来实现图像的剪裁。下面是一段示例代码:

from PyQt5.QtGui import QPixmap
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 定义剪裁区域
x = 100
y = 100
width = 200
height = 200
# 剪裁图像
cropped_pixmap = pixmap.copy(x, y, width, height)

9.png

3、旋转图像

旋转图像是将图像按指定角度进行旋转的操作。PyQt提供了 transformed() 方法来实现图像的旋转。

from PyQt5.QtGui import QPixmap, QTransform
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 定义旋转角度
angle = 45
# 旋转图像
transform = QTransform().rotate(angle)
rotated_pixmap = pixmap.transformed(transform)

10.png

4、调整亮度和对比度

调整图像的亮度和对比度可以改变图像的整体明暗和对比度水平。PyQt中可以通过遍历每一个像素来调整像素值实现这些操作。

from PyQt5.QtGui import QImage
# 加载图像文件
image = QImage("image.jpg")
# 调整亮度和对比度
brightness = 60  # 亮度调整值,可以是正数或负数
contrast = 1.2  # 对比度调整值,可以是大于1的浮点数或小于1的浮点数
# 获取图像的尺寸
width = image.width()
height = image.height()
# 调整亮度和对比度
for y in range(height):
    for x in range(width):
        pixel = image.pixel(x, y)
        # 获取像素的RGB值
        r, g, b, a = qRed(pixel), qGreen(pixel), qBlue(pixel), qAlpha(pixel)
        # 调整亮度
        r += brightness
        g += brightness
        b += brightness
        # 调整对比度
        r = int((r - 128) * contrast + 128)
        g = int((g - 128) * contrast + 128)
        b = int((b - 128) * contrast + 128)
        # 限制RGB值在0-255范围内
        r = max(0, min(r, 255))
        g = max(0, min(g, 255))
        b = max(0, min(b, 255))
        # 更新像素值
        pixel = qRgba(r, g, b, a)
        image.setPixel(x, y, pixel)

11.png

5、图像滤镜

图像滤镜是一种通过改变像素的颜色或亮度来改变图像外观的技术。PyQt中可以使用QGraphicsEffect类和其子类来实现图像滤镜效果。下面是一段简单的代码示例:

from PyQt5.QtWidgets import QGraphicsScene, QGraphicsBlurEffect
from PyQt5.QtGui import QPixmap
# 创建场景和视图
scene = QGraphicsScene()
# 加载图像文件
pixmap = QPixmap("image.jpg")
# 创建图像项并添加到场景
item = scene.addPixmap(pixmap)
# 创建图像模糊滤镜
effect_blur = QGraphicsBlurEffect()
effect_blur.setBlurRadius(5)  # 设置模糊半径
item.setGraphicsEffect(effect_blur)
# 应用滤镜效果到图像项
item.setGraphicsEffect(effect_blur)

12.png

6、转换图像格式

有时候,你可能需要将图像从一种格式转换为另一种格式。PyQt提供了convertToFormat()方法来实现图像格式的转换。

from PyQt5.QtGui import QImage, QPixmap
# 加载图像文件
image = QImage("image.jpg")
# 将图像转换为另一种格式
new_format = QImage.Format_RGB888
new_image = image.convertToFormat(new_format)
# 将QImage转换为QPixmap
pixmap = QPixmap.fromImage(new_image)

⭐写在最后

如果你感到本文对你有帮助,那就点个赞呗👍!

13.gif

目录
相关文章
|
8月前
|
API C++ 开发者
PySide vs PyQt:Python GUI开发史诗级对决,谁才是王者?
PySide 和 PyQt 是 Python GUI 开发领域的两大利器,各有特色。PySide 采用 LGPL 协议,更灵活;PyQt 默认 GPL,商业使用需授权。两者背后团队实力雄厚,PySide 得到 Qt 官方支持,PyQt 由 Riverbank Computing 打造。API 设计上,PySide 简洁直观,贴近原生 Qt;PyQt 增加 Pythonic 接口,操作更高效。性能方面,两者表现优异,适合不同需求的项目开发。选择时可根据项目特点与开源要求决定。
908 20
|
4月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
838 19
|
3月前
|
索引 Python
Python 列表切片赋值教程:掌握 “移花接木” 式列表修改技巧
本文通过生动的“嫁接”比喻,讲解Python列表切片赋值操作。切片可修改原列表内容,实现头部、尾部或中间元素替换,支持不等长赋值,灵活实现列表结构更新。
163 1
|
4月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
4月前
|
数据采集 存储 JSON
使用Python获取1688商品详情的教程
本教程介绍如何使用Python爬取1688商品详情信息,涵盖环境配置、代码编写、数据处理及合法合规注意事项,助你快速掌握商品数据抓取与保存技巧。
|
6月前
|
机器学习/深度学习 数据安全/隐私保护 计算机视觉
过三色刷脸技术,过三色刷脸技术教程,插件过人脸python分享学习
三色刷脸技术是基于RGB三通道分离的人脸特征提取方法,通过分析人脸在不同颜色通道的特征差异
|
6月前
|
XML Linux 区块链
Python提取Word表格数据教程(含.doc/.docx)
本文介绍了使用LibreOffice和python-docx库处理DOC文档表格的方法。首先需安装LibreOffice进行DOC到DOCX的格式转换,然后通过python-docx读取和修改表格数据。文中提供了详细的代码示例,包括格式转换函数、表格读取函数以及修改保存功能。该方法适用于Windows和Linux系统,解决了老旧DOC格式文档的处理难题,为需要处理历史文档的用户提供了实用解决方案。
805 1
|
5月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
378 0
|
5月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
8月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
593 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程

推荐镜像

更多