实战PyQt5: 120-像素图QPixmap和QBitmap

article/2025/10/21 4:51:11

Qt提供了四个用于处理图像数据的类:QImage,QPixmap,QBitmap和QPicture。QImage是为I/O设计的,并且针对直接的像素访问和操作做了优化,QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap为继承自QPixmap的便利类。如果QPixmap对象确实是位图,在其isQBitmap()函数返回True, 否则返回False。QPicture类是一种绘图设备,它可以记录并重放QPainter的命令。

QPixmap简介

QPixmap类可以作为绘图设备来输出离屏(off-screen)图像。使用QLabel或者QAbstractButton的子类(例如QPushbutton和QToolButton),可以在屏幕上轻松地显示QPixmap。QPixmap是QPaintDevice的子类,因此QPainter可以直接在QPixmap的对象上绘图。

QPixmap提供了多种方式来读取图像文件,在创建QPixmap对象时可以加载图像文件,也可以在创建对象之后,使用load()或者loadFrameData()函数来加载图像。加载图像时,文件名可以是磁盘上的实际文件,也可以是嵌入到应用程序的资源。QPixmap可以读取的文件类型有BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM等。

 

QPixmap的常用方法:

  • copy(self, rect): 从QRect对象复制到QPixmap对象。
  • fromImage(image, flag): 静态函数, 将QImage对象转换为QPixmap对象。
  • fill(self, color : QColor): 用给定的color填充。
  • width(self): 返回图像的宽度。
  • height(self): 返回图像的高度。
  • loadFromData(self, data, len, format,flag): 从给定的二进制数据data的前len个字节加载带像素图。如果指定了格式format,则按指定格式加载,如果未指定格式,那么加载程序将根据相关信息猜测加载格式。
  • save(self, filename, format, quality): 使用指定的图像格式format和质量因子quality将像素图保存到文件filename中。quality必须在范围[0,100]或-1。指定0以获取小的压缩文件,指定100为大的未压缩文件,并指定-1以使用默认设置。
  • toImage(): 将像素图转换为QImage。如果转换失败,则返回一个空图像。

QBitmap简介

QBitmap类提供单色(1位深度)像素图。它主要用于创建自定义QCursor和QBrush对象,构造QRegion对象以及为像素图和部件设置蒙版(mask)。QBitmap的位深度为1(空对象为0),如果将位深度大于1的像素图分配给位图,组位图将自动抖动。

在QBitmap对象上绘制图像时,使用Qt.color0将位图位设置为0,使用Qt.color1将位图位设置为1. 对一个位图来说,0位表示背景(或者透明像素),1位表示前景(或不透明像素)。使用clear()函数将所有位设置为0。注意,在位图中,使用Qt.black 和Qt.white颜色是没有意义的,因为QColor.pixel()值对于黑色并不一定是0,对于白色并不一定是1。

 

QBitmap常用函数:

  • clear(self): 清除位图,将其所有位都设置为Qt.color0。
  • fromData( size:QSize, bits, format): 静态函数,创建一个给定size大小的位图,并将其内容设置为给定的bits。
  • fromImage(image, flag): 静态函数,从给定的图像image创建一个位图。

测试

演示程序使用QPixmap加载一个图像文件,结合QPainter变换操作,演示缩放,旋转和扭曲图像效果。 完整代码如下:

import sys,os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter,QPixmap
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget,QMenuBar, QMenu, QAction, QGridLayout,QSizePolicy)class MyPixmapWidget(QWidget):def __init__(self, type, parent = None):super(MyPixmapWidget, self).__init__(parent)self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)self.type = typeself.image_filename = os.path.dirname(__file__) + '/panda.jpg'def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing, True)#绘制边框线painter.drawRect(self.rect())self.setFixedSize(256, 256)if self.type == '原图':self.drawOrignal(painter)elif self.type == '缩小':self.drawZoomOut(painter)elif self.type == '放大':self.drawZoomIn(painter)elif self.type == '旋转':self.drawRotate(painter)elif self.type == '横向扭曲':self.drawShearHor(painter)elif self.type == '纵向扭曲':self.drawShearVer(painter)else:print('not supported')def drawOrignal(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '原图')pix = QPixmap(self.image_filename)rect = self.rect() painter.translate((rect.width() - pix.width()) / 2, (rect.height() - pix.height()) / 2)painter.drawPixmap(0, 0, pix)def drawZoomOut(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '缩小')pix = QPixmap(self.image_filename)rect = self.rect() new_w = pix.width() * 0.5new_h = pix.height() * 0.5pix = pix.scaled(new_w, new_h, Qt.KeepAspectRatio)painter.translate((rect.width() - new_w) / 2, (rect.height() - new_h) / 2)painter.drawPixmap(0, 0, pix)def drawZoomIn(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '放大')pix = QPixmap(self.image_filename)rect = self.rect() new_w = pix.width() * 1.5new_h = pix.height() * 1.5pix = pix.scaled(new_w, new_h, Qt.KeepAspectRatio)painter.translate((rect.width() - new_w) / 2, (rect.height() - new_h) / 2)painter.drawPixmap(0, 0, pix)def drawRotate(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '旋转')pix = QPixmap(self.image_filename)rect = self.rect() img_w = pix.width()img_h = pix.height()painter.rotate(60)painter.translate(100, -100)painter.drawPixmap(0, 0, pix)def drawShearHor(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '横向扭曲')pix = QPixmap(self.image_filename)rect = self.rect() painter.translate(20, (rect.height() - pix.height()) / 2)painter.shear(0.5,0); #横向扭曲painter.drawPixmap(0, 0, pix)def drawShearVer(self, painter):painter.drawText(self.rect(),  Qt.AlignBottom|Qt.AlignCenter, '纵向扭曲 ')pix = QPixmap(self.image_filename)rect = self.rect() painter.translate((rect.width() - pix.width()) / 2, 20)painter.shear(0,0.5); #纵向扭曲 painter.drawPixmap(0, 0, pix)class DemoPixmap(QMainWindow):def __init__(self, parent=None):super(DemoPixmap, self).__init__(parent)   # 设置窗口标题self.setWindowTitle('实战 Qt for Python: QPixmap 演示')      self.initUi()def initUi(self):self.initMenuBar()mainWidget = QWidget()layout = QGridLayout()       lhGrad = MyPixmapWidget('原图') lvGrad = MyPixmapWidget('缩小')ldGrad = MyPixmapWidget('放大')qGradA = MyPixmapWidget('旋转')qGradB = MyPixmapWidget('横向扭曲')cGrad =  MyPixmapWidget('纵向扭曲')layout.addWidget(lhGrad, 0, 0)layout.addWidget(lvGrad, 0, 1)layout.addWidget(ldGrad, 0, 2)layout.addWidget(qGradA, 1, 0)layout.addWidget(qGradB, 1, 1)layout.addWidget(cGrad, 1, 2)mainWidget.setLayout(layout)self.setCentralWidget(mainWidget)def initMenuBar(self):menuBar = self.menuBar() menuFile = menuBar.addMenu('文件(&F)')actionExit = QAction('退出(&X)', self)actionExit.triggered.connect(QApplication.instance().quit)menuFile.addAction(actionExit)if __name__ == '__main__':app = QApplication(sys.argv)window = DemoPixmap()window.show()sys.exit(app.exec())

运行结果如下图:

实战PyQt5:120-像素图QPixmap和QBitmap

QPixmap演示

本文知识点

  • Qt提供了四个用于处理图像数据的类。
  • 使用QPixmap来加载和显示图像。
  • 使用QPixmap来绘制离屏图像。
  • 保存QPixmap。
  • QBitmap位图。

前一篇: 实战PyQt5: 119-图标处理类QIcon


http://chatgpt.dhexx.cn/article/aOn58nko.shtml

相关文章

Qt实战案例(54)——利用QPixmap设计图片透明度

目录 一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件 五、效果演示 一、项目介绍 本文介绍利用QPixmap设计图片透明度,可以看到拖动下方进度条,用于控制上方图片的透明度。 二、项目基本配置 新建…

利用QPixmap显示图片

我们来实现在窗口上显示图片,并将图片进行平移,缩放,旋转和扭曲。这里我是利用QPixmap类来实现图片显示的。 一、利用QPixmap显示图片。 1.将以前的工程文件夹进行复制备份,我们这里将工程文件夹改名为painter05。(经…

PyQt5基本控件详解之QPixmap(十九)

QPixmap 前言 QPixmap类用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像 QPixmap可以读取的图像文件类型有BMP,GIF,JP…

[PyQt5]基本控件9 - 图片显示QPixmap

文章目录 PyQt5系列文章效果图完整代码 PyQt5系列文章 基本控件---1.按钮QPushButton2.标签QLabel3.可编辑框QTextEdit4.文本提示QToolTip5.单行输入框QLineEdit6.消息框QMessageBox7.单选按钮QRadioButton8.下拉列表QComboBox9.图片显示QPixmap10.分组框QGroupBox11.进度条QP…

关于QPixmap/QImage/QPicture

Qt学习之路(29):绘图设备(2) 绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和 QPicture。其中,QPixmap专门为图像在屏幕上的显示做了优化&a…

QPixmap、QBitmap、QImage 與 QPicture

在處理影像資料上,Qt提供了QPixmap、QBitmap、QImage與QPicture等類別。 一. 几种类的简介 QPixmap繼承了QPaintDevice,您可用以建立QPaint er並於上進行繪圖,您也可以直接指定圖案載入Qt所支援的圖檔,像是BMP、GIF、JPG、JPEG、…

QPixmap使用scaled()函数缩放失败

因为需要,需要将QPixmap在控件上显示并进行缩放,将其缩放成与控件一般大; 但是发现并没有缩放成功(见图一); 看下代码: QPixmap pixmap;if(pixmap.load(url)) {pixmap.scaled(width(), height…

QPixmap显示图片

我们来实现在窗口上显示图片,并将图片进行平移,缩放,旋转和扭曲。这里我是利用QPixmap类来实现图片显示的。 一、利用QPixmap显示图片。 1.将以前的工程文件夹进行复制备份,我们这里将工程文件夹改名为painter05。(经…

QT绘制图像QImage-QPixmap-QBitmap-QPicture

QT绘制图像QImage-QPixmap-QBitmap-QPicture #ifndef MAINWINDOW10_8_H #define MAINWINDOW10_8_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow10_8; } QT_END_NAMESPACEclass MainWindow10_8 : public QMainWindow {Q_OBJECTpublic:MainW…

QT使用QLabel控件显示图片,报错:QPixmap::scaled: Pixmap is a null pixmap

Label 和 pushButton 两个控件 实现点击 按钮 标签显示图片的功能 槽函数如下 Widget.cpp 同级目录img中有图片 1.png 但是点击后报错&#xff1a;QPixmap::scaled: Pixmap is a null pixmap 在网上看了很多帖子&#xff1a; 文件名改为英文&#xff08;未解决问题&#xff09;…

图像处理QPixmap、Picture、QBitmap

QPixmap 类是一种可用作绘制设备的屏幕外图像表示形式。 QPixmap可以使用QLabel或QAbstractButton的子类之一可以轻松显示在屏幕上 QPixmap 对象可以按值传递&#xff0c;因为 QPixmap 类使用隐式数据共享&#xff0c;也可以流式传输。 QPixmap可以和QImage之间进行转换&…

基于Qt的QPixmap和Qimage实现无锯齿圆角图片设置

简述 开发环境&#xff1a;Window10&#xff0c;Qt 5.9.9 &#xff0c;mingw32 近期做的用来展示图片的软件&#xff0c;涉及到使用QLabel控件和QPixmap类来显示圆角图片。 查了一些资料&#xff0c;发现实现的基本步骤是&#xff1a; 1.读取图片。通过Qt中的QImage或Qpixmap…

PyQt5组件之QPixmap

QPixmap简介 QPixmap类用于绘图设备的图像显示&#xff0c;它可以作为一个QPainterDevice对象&#xff0c;也可以加载到一个控件中&#xff0c;通常是标签或者按钮&#xff0c;用于在标签或按钮上显示图像QPixmap可以读取的图像文件类型有BMP&#xff0c;GIF&#xff0c;JPG等…

QPixmap

一、描述 Qt 提供了四个用于处理图像数据的类&#xff1a; QImage 是为 I/O 以及直接像素访问和操作而设计和优化的。QPixmap 是为在屏幕上显示图像而设计和优化的。QBitmap是一个继承QPixmap的便利类&#xff0c;保证深度为1。如果QPixmap对象确实是位图&#xff0c;isQBitm…

【全奖博士】香港大学招收计算机视觉方向博士/博后/研究助理

来源&#xff1a;AI求职 香港大学 香港大学 (The University of Hong Kong)&#xff0c;简称港大 (HKU)&#xff0c;是一所国际化公立研究型大学&#xff0c;位于香港岛中西区&#xff0c;成立于 1911 年。在最新 QS 世界排名和泰晤士世界排名中&#xff0c;分别位列第 21 位和…

为什么有的计算机本科生就能发表顶会,但是许多博士生还是一篇都没有?

我知道知乎有很多大神本科生&#xff0c;也有很多普通的博士生。希望本科大佬不要看不起那些平庸博士&#xff0c;博士生也不要嫉妒本科大佬。大家尽量客观的分析问题。 本科生还有很多时间要上课&#xff0c;博士生全天科研而且有4,5年的时间。虽然能发顶会的本科生肯定是非常…

计算机专业博士阶段研究方向,国内计算机专业博士研究方向

国内计算机专业博士研究方向 国内计算机专业博士研究方向 学校名称 专业 研究方向 复旦大学 081202 计算机软件与理论 01数据库与知识库 02数字图书馆 03数据挖掘 04电子商务 05软件工程 06Web数据管理与数据挖掘 07对等(P2P) 计算技术 08流数据分析与管理 09智能信息处理 10算…

怎么学好数据结构?北大计算机博士亲授。

首先明确一下&#xff0c;为什么要学好数据结构&#xff1f;如果你是一位职场人士&#xff0c;那你肯定知道&#xff0c;工作中要用到数据结构的时候少之又少&#xff0c;所以很少会有职场人特意来学好数据结构。但是据我观察&#xff0c;这依然是有必要的。而且很多公司包括一…

计算机相关专业提升学历的解决方案(博士研究生)

文章目录 1、正规全日制博士1.1 申请 - 考核制1.2 硕博连读与直博 2、继续教育&#xff08;非全日制&#xff09;2.1 在职博士2.2 同等学力申博 3、海外博士3.1 海外博士3.2 中外合作博士 博士录取政策 国内博士&#xff0c;没有具体的政策&#xff0c;招生权力下放到各个高校。…

博士申请 | 香港大学计算机科学系黄超老师招收2022年入学全奖博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 香港大学 黄超老师将于 2021 年秋季加入香港大学&#xff08;University of Hong Kong-HKU&…