QImage.Format_ARGB8565_Premultiplied (8): 使用预乘的24位ARGB格式(8-5-6-5)存储图像 。 QImage.Format_RGB666 (9): 图像以24位RGB格式(6-6-6)存储 。 未使用的最高有效位始终为零 。 QImage.Format_ARGB6666_Premultiplied (10): 使用预乘的24位ARGB格式(6-6-6-6)存储图像 。 QImage.Format_RGB555 (11): 图像以16位RGB格式(5-5-5)存储 。 未使用的最高有效位始终为零 。 QImage.Format_ARGB8555_Premultiplied (12): 使用预乘的24位ARGB格式(8-5-5-5)存储图像 。 QImage.Format_RGB888 (13): 图像以24位RGB格式(8-8-8)存储 。 QImage.Format_RGB444 (14): 图像以16位RGB格式(4-4-4)存储 。 未使用的位始终为零 。 QImage.Format_ARGB4444_Premultiplied (15): 使用预乘的16位ARGB格式(4-4-4-4)存储图像 。 QImage.Format_RGBX8888 (16): 图像使用32位字节排序的RGB(x)格式(8-8-8-8)存储 。 这与Format_RGBA8888相同 , 除了alpha必须始终为255 。 (在Qt 5.2中添加)QImage.Format_RGBA8888 (17): 图像使用32位字节顺序RGBA格式(8-8-8-8)存储 。 与ARGB32不同 , 这是一种字节排序格式 , 这意味着32位编码在大字节序和小字节序架构之间有所不同 , 分别为(0xRRGGBBAA)和(0xAABBGGRR) 。 如果读取为字节0xRR , 0xGG , 0xBB , 0xAA , 则颜色顺序在任何体系结构上都是相同的 。 (在Qt 5.2中添加) 。 QImage.Format_RGBA8888_Premultiplied (18): 使用预乘的32位字节排序RGBA格式(8-8-8-8)存储图像 。 (在Qt 5.2中添加) 。 QImage.Format_BGR30 (19): 图像使用32位BGR格式(x-10-10-10)存储 。 (在Qt 5.4中添加) 。 QImage.Format_A2BGR30_Premultiplied (20): 图像使用32位预乘ABGR格式(2-10-10-10)存储 。 (在Qt 5.4中添加) 。 QImage.Format_RGB30 (21): 图像以32位RGB格式(x-10-10-10)存储 。 (在Qt 5.4中添加) 。 QImage.Format_A2RGB30_Premultiplied (22): 图像使用32位预乘ARGB格式(2-10-10-10)存储 。 (在Qt 5.4中添加) 。 QImage.Format_Alpha8 (23): 图像使用仅8位alpha格式存储 。 (在Qt 5.5中添加) 。 QImage.Format_Grayscale8 (24): 图像使用8位灰度格式存储 。 (在Qt 5.5中添加) 。 QImage.Format_Grayscale16 (28): 图像使用16位灰度格式存储 。 (在Qt 5.13中添加) 。 QImage.Format_RGBX64 (25): 使用64位半字排序的RGB(x)格式(16-16-16-16)存储图像 。 这与Format_RGBA64相同 , 除了alpha必须始终为65535 。 (在Qt 5.12中添加) 。 QImage.Format_RGBA64 (26): 图像使用64位半字排序RGBA格式(16-16-16-16)存储 。 (在Qt 5.12中添加) 。 QImage.Format_RGBA64_Premultiplied (27): 使用预乘的64位半字排序RGBA格式(16-16-16-16)存储图像 。 (在Qt 5.12中添加) 。 QImage.Format_BGR888 (29): 图像使用24位BGR格式存储 。 (在Qt 5.14中添加) 。 图像变换和图像属性修改QImage支持许多用于创建新图像的功能:
- createAlphaMask(): 从该图像的alpha缓冲区生成并返回一个1-bpp的蒙版
- mirrored(): 生成一个径向图像
- scaled(): 生成一个缩放图像
- rgbSwapped(): 从RGB图像构造一个BGR图像
- scaledToWidth(): 返回缩放到指定宽度的图像
- caledToHeight(): 返回缩放到指定高度的图像
- transformed():返回使用给定的转换矩阵和转换模式转换的图像
一些用于就地图像属性的函数:
- setDotsPerMeterX(): 设置物理单位的水平像素数来定义纵横比 。
- setDotsPerMeterY(): 设置物理单位的垂直像素数来定义纵横比 。
- fill(): 用给定的像素值填充整个图像 。
- invertPixels(): 使用给定的InvertMode值反转图像中的所有像素值 。
- setColorTable(): 设置用于转换颜色索引的颜色表 。 仅单色和8位格式 。
- setColorCount(): 调整颜色表的大小 。 仅单色和8位格式 。
创建一个看图应用参考pyqt5-examples样例文件imageviewer.py, 实现一个简单的看图程序 , 完整代码如下:
import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qt, QDirfrom PyQt5.QtGui import QImage, QPainter, QPixmap, QPalettefrom PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu, QAction,QFileDialog, QMessageBox, QLabel, QScrollArea, QSizePolicy)from PyQt5.QtPrintSupport import QPrintDialog, QPrinter class ImageViewer(QMainWindow):def __init__(self, parent=None):super(ImageViewer, self).__init__(parent)# 设置窗口标题self.setWindowTitle('实战Qt for Python: QImage实现一个看图应用')# 设置窗口大小self.resize(500, 400)self.initUi()def initUi(self):#打印self.printer = QPrinter()#缩放因子self.scaleFactor = 0.0#创建显示图片的窗口self.imgLabel = QLabel()self.imgLabel.setBackgroundRole(QPalette.Base)self.imgLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)self.imgLabel.setScaledContents(True)self.scrollArea = QScrollArea()self.scrollArea.setBackgroundRole(QPalette.Dark)self.scrollArea.setWidget(self.imgLabel)self.setCentralWidget(self.scrollArea)self.initMenuBar()def initMenuBar(self):menuBar = self.menuBar()menuFile = menuBar.addMenu('文件(&F)')menuView = menuBar.addMenu('视图(&V)')actionOpen = QAction('打开(&O)...', self, shortcut='Ctrl+O', triggered=self.onFileOpen)self.actionPrint = QAction('打印(&P)...', self, shortcut='Ctrl+P', enabled=False, triggered=self.onFilePrint)actionExit = QAction('退出(&X)', self, shortcut='Ctrl+Q', triggered=QApplication.instance().quit)self.actionZoomIn = QAction('放大(25%)(&I)', self, shortcut='Ctrl++', enabled=False, triggered=self.onViewZoomIn)self.actionZoomOut = QAction('缩小(25%)(&O)', self, shortcut='Ctrl++', enabled=False, triggered=self.onViewZoomOut)self.actionNormalSize = QAction('原始尺寸(&N)', self, shortcut='Ctrl+S', enabled=False, triggered=self.onViewNormalSize)self.actionFitToWindow = QAction('适应窗口(&F)', self, shortcut='Ctrl+F', enabled=False, checkable=True, triggered=self.onViewFitToWindow)menuFile.addAction(actionOpen)menuFile.addAction(self.actionPrint)menuFile.addSeparator()menuFile.addAction(actionExit)menuView.addAction(self.actionZoomIn)menuView.addAction(self.actionZoomOut)menuView.addAction(self.actionNormalSize)menuView.addSeparator()menuView.addAction(self.actionFitToWindow)#打开文件def onFileOpen(self):filename,_ = QFileDialog.getOpenFileName(self, '打开文件', QDir.currentPath())if filename:image = QImage(filename)if image.isNull():QMessageBox.information(self, '图像浏览器', '不能加载文件%s.' % filename)returnself.imgLabel.setPixmap(QPixmap.fromImage(image))self.scaleFactor = 1.0self.actionPrint.setEnabled(True)self.actionFitToWindow.setEnabled(True)self.updateActions()if not self.actionFitToWindow.isChecked():self.imgLabel.adjustSize()#打印def onFilePrint(self):dlg = QPrintDialog(self.printer, self)if dlg.exec():painter = QPainter(self.printer)rect = painter.viewport()size = self.imgLabel.pixmap().size()size.scale(rect.size(), Qt.KeepAspectRatio)painter.setViewport(rect.x(), rect.y(), size.width(), size.height())painter.setWindow(self.imgLabel.pixmap().rect())painter.drawPixmap(0, 0, self.imgLabel.pixmap())#放大图像def onViewZoomIn(self):self.scaleIamge(1.25)def onViewZoomOut(self):self.scaleIamge(0.8)def onViewNormalSize(self):self.imgLabel.adjustSize()self.scaleFactor = 1.0def onViewFitToWindow(self):fitToWindow = self.actionFitToWindow.isChecked()self.scrollArea.setWidgetResizable(fitToWindow)if not fitToWindow:self.onViewNormalSize()self.updateActions()def updateActions(self):checked = not self.actionFitToWindow.isChecked()self.actionZoomIn.setEnabled(checked)self.actionZoomOut.setEnabled(checked)self.actionNormalSize.setEnabled(checked)def scaleIamge(self, factor):self.scaleFactor *= factorself.imgLabel.resize(self.scaleFactor * self.imgLabel.pixmap().size())self.adjustScrollBar(self.scrollArea.horizontalScrollBar(), factor)self.adjustScrollBar(self.scrollArea.verticalScrollBar(), factor)self.actionZoomIn.setEnabled(self.scaleFactor