PySide6 GUI 学习笔记——常用类及控件使用方法(常用图像类)
文章目录
- PySide6 图像类及应用举例
- PySide6 图像类继承关系图
- QImage 常用方法
- QPixmap 常用方法
- QPixmap 支持的文件格式
- QPicture 常用方法
- QBitmap 常用方法
PySide6 图像类及应用举例
PySide6 提供了 QImage
、QPixmap
、QPicture
和 QBitmap
四个类,用于处理图像。
QPixmap
适合将图像显示在电脑屏幕上,可以使用QPixmap
在程序中打开png、jpeg等图片。QBitmap
是QPixmap
的子类,用于处理位图,它的色深限定为1,颜色只有两种:黑色和白色,用于制作光标QCursor
或画刷QBrush
等。QImage
专门读取像素文件,其存储独立于硬件,是一种QPaintDevice
设备,可直接在QImage
上用QPainter
进行图像绘制,且可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,从而提高GUI响应速度。对于小图片,可以直接使用QPixmap
加载,而对于大图片,QPixmap
加载会消耗很大的内存,因此QImage
更适合这种场景。QImage
可以转换成QPixmap
。QPicture
是一个可以记录和重现QPainter
命令的绘图设备,它可以保存QPainter
绘制的图形,QPicture
将QPainter
的命令序列化到一个IO设备上,保存为一个平台独立的文件格式。QPainter
与平台无关,可以用在多种设备上,比如svg、pdf、ps、打印机或屏幕等。
它们的继承关系如下:
PySide6 图像类继承关系图
QImage 常用方法
方法名 | 说明 |
---|---|
load(filename) | 从文件加载图像 |
save(filename) | 保存图像到文件 |
width() | 获取图像宽度 |
height() | 获取图像高度 |
pixel(x, y) | 获取指定像素的颜色 |
setPixel(x, y, c) | 设置指定像素的颜色 |
scaled(w, h) | 返回缩放后的图像 |
示例代码:
from PySide6.QtGui import QImage
img = QImage("test.png")
print(img.width(), img.height())
img.save("copy.png")
QPixmap 常用方法
方法名 | 说明 |
---|---|
load(filename) | 从文件加载图像 |
save(filename) | 保存图像到文件 |
width() | 获取图像宽度 |
height() | 获取图像高度 |
scaled(w, h) | 返回缩放后的 QPixmap |
toImage() | 转换为 QImage |
QPixmap 支持的文件格式
格式 | 描述 | Qt 支持 |
---|---|---|
BMP | Windows 位图 | 读/写 |
GIF | 图形交换格式(可选) | 读取 |
JPG | 联合图像专家组 | 读/写 |
JPEG | 联合图像专家组 | 读/写 |
PNG | 便携式网络图形 | 读/写 |
PBM | 便携式位图 | 读取 |
PGM | 便携式灰度图 | 读取 |
PPM | 便携式像素图 | 读/写 |
XBM | X11 位图 | 读/写 |
XPM | X11 像素图 | 读/写 |
示例代码:
import sys
from PySide6.QtWidgets import QApplication,QWidget,QLabel,QVBoxLayout,\QPushButton,QFileDialog
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qtclass MyPixmap(QWidget):def __init__(self,parent=None):super().__init__(parent)self.setGeometry(200,200,800,500) #设置窗口尺寸self.setupUi() #调用函数建立界面def setupUi(self): #创建界面self.label = QLabel("单击按钮打开图像文件!") #创建标签self.label.setAlignment(Qt.AlignCenter) #中心对齐font = self.label.font() #获取字体font.setPointSize(10) #设置字体大小self.label.setFont(font) #给标签设置字体self.open_button = QPushButton("打开图像文件(&O)") #创建按钮self.open_button.setFont(font) #给按钮设置字体self.vertical_layout = QVBoxLayout(self) #在窗口上创建竖直布局self.vertical_layout.addWidget(self.label) #在布局中添加标签self.vertical_layout.addWidget(self.open_button) #在布局中添加按钮self.open_button.clicked.connect(self.open_button_clciked) #按钮信号与槽的连接def open_button_clciked(self):fileName,filter = QFileDialog.getOpenFileName(filter= #打开对话框获取文件名'图像文件(*.png *.bmp *.jpg *.jpeg);;所有文件(*.*)')pixmap = QPixmap(fileName) #创建QPixmap图像self.label.setPixmap(pixmap) #在标签中显示图像
if __name__ == '__main__':app = QApplication(sys.argv)window = MyPixmap()window.show()sys.exit(app.exec())
QPicture 常用方法
方法名 | 说明 |
---|---|
load(filename) | 从文件加载绘图指令 |
save(filename) | 保存绘图指令到文件 |
play(painter) | 在 QPainter 上重现绘图 |
isNull() | 判断是否为空 |
示例代码:
from PySide6.QtGui import QPicture, QPainter
pic = QPicture()
painter = QPainter(pic)
painter.drawLine(0, 0, 100, 100)
painter.end()
pic.save("drawing.pic")
QBitmap 常用方法
方法名 | 说明 |
---|---|
fromImage(image) | 从 QImage 创建 QBitmap |
clear() | 清空位图 |
isNull() | 判断是否为空 |
scaled(w, h) | 返回缩放后的 QBitmap |
示例代码:
from PySide6.QtGui import QBitmap, QImage
img = QImage("mask.png")
bitmap = QBitmap.fromImage(img)
bitmap.save("bitmap.bmp")
import sys
from PySide6.QtWidgets import QApplication,QWidget
from PySide6.QtGui import QPainter,QPixmap,QBitmap,QImage,QColor
from PySide6.QtCore import QRectclass ShowPictures(QWidget):def __init__(self,parent=None):super().__init__(parent)self.setWindowTitle("绘图")self.pix = QPixmap()self.bit = QBitmap()self.image = QImage()self.pix.load("pic.png")self.bit.load("pic.png")self.image.load("pic.png")#下面创建两个image图像,分别存储灰度图和明亮图self.image_1=QImage(self.image.width(),self.image.height(),QImage.Format_ARGB32)self.image_2=QImage(self.image.width(),self.image.height(),QImage.Format_ARGB32)self.gray() #调用灰度处理函数self.bright() #调用明亮处理函数def paintEvent(self, event):w = int(self.width()/2) #窗口的一半宽度h = int(self.height()/2) #窗口的一半高度rect1 = QRect(0,0,w-2,h-2) #矩形区域1rect2 = QRect(w,0,w-2,h-2) #矩形区域2rect3 = QRect(0,h, w-2, h-2) #矩形区域3rect4 = QRect(w,h,w-2,h-2) #矩形区域4painter = QPainter(self)painter.drawPixmap(rect1,self.pix) #在矩形区域1绘图图像painter.drawPixmap(rect2,self.bit) #在矩形区域2绘图图像painter.drawImage(rect3,self.image_1) #在矩形区域3绘图图像painter.drawImage(rect4,self.image_2) #在矩形区域4绘图图像def gray(self): #对图像进行灰度处理color = QColor()for i in range(1,self.image_1.width()+1):for j in range(1,self.image_1.height()+1):alpha = self.image.pixelColor(i, j).alpha() #获取像素点alpha值r = self.image.pixelColor(i, j).red() #获取像素点红色值g = self.image.pixelColor(i, j).green() #获取像素点绿色值b = self.image.pixelColor(i, j).blue() #获取像素点蓝色值average = int((r+g+b)/3) #取平均值color.setRgb(average,average,average,alpha) #设置颜色self.image_1.setPixelColor(i,j,color) #设置像素点的颜色self.image_1.save("gray.jpg") #保存文件def bright(self): #对图像进行明亮处理color = QColor()delta = 50 #RGB增加值for i in range(1,self.image_1.width()+1):for j in range(1,self.image_1.height()+1):alpha = self.image.pixelColor(i,j).alpha()r = self.image.pixelColor(i, j).red()+ deltag = self.image.pixelColor(i, j).green()+ deltab = self.image.pixelColor(i, j).blue()+ deltaif r > 255: r = 255if g > 255: g = 255if b > 255: b = 255color.setRgb(r, g, b, alpha)self.image_2.setPixelColor(i,j,color)self.image_2.save("bright.jpg")
if __name__ == '__main__':app=QApplication(sys.argv)window = ShowPictures()window.show()sys.exit(app.exec())