首先用通俗的方式解释:
- QImage:是 “后台” 图像类,专注于像素级的图像数据处理,运行在 CPU 上,不依赖 GUI 渲染线程,适合图像的读写、修改、像素操作,它注重的是“图像文件的像素数据”。
- QPixmap:是 “前台” 图像类,专注于高效的 GUI 显示,针对屏幕渲染做了优化(尤其是在不同平台上的硬件加速),运行在 GUI 线程,适合直接在界面上绘制、显示,它注重的是“屏幕显示的内容”。
两者的核心关系是:
- 可以相互转换,通常的开发模式是 “用 QImage 处理图像,转成 QPixmap 显示”。
1. 核心特性对比
| 特性 | QImage | QPixmap |
|---|---|---|
| 主要用途 | 图像数据处理、像素操作、IO 读写 | GUI 界面显示、渲染(标签、画布) |
| 线程安全 | 线程安全(可在非 GUI 线程使用) | 非线程安全(仅能在主线程使用) |
| 内存管理 | 基于 CPU 内存 | 基于 GPU / 显存(平台优化) |
| 像素访问 | 支持直接读写单个像素 | 不支持高效的像素级操作 |
| 平台依赖 | 跨平台一致,无依赖 | 依赖平台的绘图系统(自动优化) |
2. 相互转换的代码示例
这是最常用的场景,先通过 QImage 读取 / 处理图像,再转 QPixmap 显示:
import sys from PySide6.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout from PySide6.QtGui import QImage, QPixmap class ImageDemo(QWidget): def __init__(self): super().__init__() self.init_ui() def init_ui(self): self.setWindowTitle("QImage & QPixmap 示例") layout = QVBoxLayout() # 1. 用QImage读取图像(处理层面) # 支持的格式:png/jpg/bmp/gif等,可直接读取文件或字节流 image = QImage("test.png") if image.isNull(): # 检查图像是否加载成功 print("图像加载失败!") return # 对QImage进行像素级处理(示例:调整尺寸) processed_image = image.scaled(400, 300, aspectRatioMode=1) # 2. 转换为QPixmap(显示层面) pixmap = QPixmap.fromImage(processed_image) # 3. 用QLabel显示QPixmap label = QLabel() label.setPixmap(pixmap) layout.addWidget(label) self.setLayout(layout) self.resize(400, 300) if __name__ == "__main__": app = QApplication(sys.argv) window = ImageDemo() window.show() sys.exit(app.exec())关键代码解释:
QImage("test.png"):从文件加载图像,返回 QImage 对象,可进行像素操作(如pixel(x,y)读取像素、setPixel(x,y, color)修改像素)。QPixmap.fromImage(processed_image):将处理后的 QImage 转换为 QPixmap,这是最常用的转换方式。- 反向转换(QPixmap 转 QImage):
image = pixmap.toImage(),适合将显示的图像转回 QImage 做后续处理。
3. 典型使用场景
使用 QImage 的场景:
- 读取 / 写入图像文件(如 jpg/png);
- 逐像素修改图像(如滤镜、抠图、像素值计算);
- 在非 GUI 线程中处理图像(避免阻塞主线程);
- 处理原始图像数据(如从摄像头、网络获取的字节流)。
使用 QPixmap 的场景:
- 在 QLabel、QPushButton、QPainter 中显示图像;
- 图像的屏幕渲染(自动适配高 DPI、硬件加速);
- 临时缓存需要频繁显示的图像(优化渲染性能)。
总结
- 核心定位:QImage 负责 “处理图像数据”,QPixmap 负责 “显示图像”,两者是 “处理 - 显示” 的协作关系。
- 线程安全:QImage 可在非主线程使用,QPixmap 仅能在 GUI 主线程使用。
- 转换方式:通过
QPixmap.fromImage()和pixmap.toImage()实现双向转换,是 PySide6 中图像编程的核心操作。