QT绘图类 QPixmap、QImage、QPicture、QBitmap

前言

绘图设备是指继承 QPaintDevice 的子类,你可以使用 QPainter 直接在其上面绘制图形,Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类,分别是:QPixmap、QBitmap、QImage和 QPicture。其中:

  • QPixmap是为在屏幕上显示图像而设计和优化;
  • QBitmap是 QPixmap 的一个子类,它的色深限定为 1,你可以使用 QPixmap 的 isQBitmap() 函数来确定这个QPixmap 是不是一个 QBitmap;
  • QImage是为 I/O 和直接像素访问和操作而设计和优化;
  • QPicture是一个绘图装置,用于记录和重播Qpainter的绘图指令;

1.QPixmap和QBitmap

QPixmap继承了QPaintDevice,因此,可以使用QPainter直接在上面绘制图形。QPixmap也可以接受一个字符串作为一个文件的路径来显示这个文件,比如你想在程序之中打开png、jpeg之类的文件,就可以使用 QPixmap。使用QPainter的drawPixmap()函数可以把这个文件绘制到一个QLabel、QPushButton或者其他的设备上面。

QPixmap是针对屏幕上显示图像而进行特殊优化的,因此,它与实际的底层显示设备息息相关。注意,这里说的显示设备并不是硬件,而是操作系统提供的原生的绘图引擎。所以,在不同的操作系统平台下,QPixmap的显示可能会有所差别。

QBitmap继承自QPixmap,因此具有QPixmap的所有特性,但只提供单色图像,也就是说QBitmap实际上是只有黑白两色的图像数据。由于QBitmap色深小,因此只占用很少的存储空间,所以适合做光标文件和笔刷。

程序演示:

void Widget::paintEvent(QPaintEvent *)
{QPainter p(this);//定义画家//QPixmap 图片背景透明//p.drawPixmap(0,0,200,200,QPixmap("../image/10.jpg"));//QBitmap 图片背景透明//p.drawPixmap(200,0,200,200,QBitmap("../image/10.jpg"));//QPixmap 图片背景白色QPixmap pixmap;pixmap.load("../image/pig.jpg");p.drawPixmap(0,200,200,200,pixmap);//QPixmap 图片背景白色QBitmap bitmap;bitmap.load("../image/pig.jpg");p.drawPixmap(200,200,200,200,bitmap);
}

结果:

                        

参考:Qt5基础 QPixmap和QBitmap的区别_qbit qt-CSDN博客

2. QImage

由于QImage是独立于硬件的,也是一种QPaintDevice,因此我们可以在另一个线程中对其进行绘制,而不需要在GUI线程中处理,使用这一方式可以很大幅度提高UI响应速度;

QImage 类用于加载图像文件,可选地操作图像数据,然后将 QImage 对象转换为 QPixmap 以显示在屏幕上。或者,如果不需要任何操作,可以将图像文件直接加载到 QPixmap 中,

QImage 则是使用独立于硬件的绘制系统,实际上是自己绘制自己,因此提供了像素级别的操作,并且能够在不同系统之上提供一个一致的显示形式。

代码如下:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QImage image(300, 200, QImage::Format_RGB888);image.fill(Qt::white);QPainter painter(&image);painter.setPen(QPen(Qt::black, 5));painter.drawRect(QRect(30, 30, 240, 140));painter.setFont(QFont("Arial", 16, QFont::Bold));painter.drawText(QPoint(65, 85), "Hello QImage!");ui->label->setPixmap(QPixmap::fromImage(image));}

结果:

 如需深入了解QImage类可以参考:QImage类的使用-CSDN博客

Qt实战案例(36)——利用QImage类实现对图像的基本操作(图像显示、图像缩放、图像旋转)_qimage 旋转-CSDN博客

3.QPicture

记录和回放QPainter的绘图指令

  • begin() 开始在QPicture上绘图 
  • end() 结束在QPicture上绘图 
  • save() 保存操作为.pic文件 
  • load() 加载.pic文件

构造函数种保存图片

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QPicture picture;QPainter painter;painter.begin(&picture);painter.drawEllipse(10,20,80,70);painter.end();picture.save("my.pic");}

paintEvent函数种加载图片

void MainWindow::paintEvent(QPaintEvent* e)
{QPicture picture;picture.load("my.pic");QPainter painter;painter.begin(this);painter.drawPicture(0,0,picture);painter.end();
}

结果:

参考:Qt 处理图像数据的类区别(QPixmap、QImage、QPicture)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286577.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广州华锐互动 | VR稀有金属冶炼业职业危害教学系统

虚拟现实(VR)技术在许多领域都得到了广泛的应用,其中包括职业病危害培训。对于稀有金属加工场所来说,VR技术可以提供一种全新的、高效的培训方式,帮助员工了解和预防职业病的危害。 传统的职业病危害培训通常需要大量的…

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…

html行内元素和块级元素的区别?

HTML中的元素可以分为两种类型:行内元素(inline)和块级元素(block) 文章目录 什么是行内元素什么是块级元素元素转换行内元素转块级元素块级元素转行内元素 区别总结 什么是行内元素 HTML的行内元素(inli…

【23真题】第七题90%做错,搞心态!

哈喽大家好,现在这个时间节点,有很多同学开始刷真题了!所以23真题系列正式启动!小马哥将全面发布23真题及详细解析! 今天分享的是23年山东师范大学850的信号与系统回忆版试题及解析。这套是好久之前答应了梦马班的同学…

PowerShell实战(一)PowerShell使用ImportExcel模块轻松操作Excel

目录 一、介绍 二、安装模块 三、操作示例 1、导出excel 2、读取Excel数据 3、导出包含图表的Excel 4、导出包含汇总列和图表的Excel 一、介绍 ImportExcel模块可以理解为基于PowerShell环境操作Excel的强大类库,使用它可以在 Windows、Linux 和 Mac 上都可以使用。…

100G光模块可以插40G端口吗?

传统数据中心主要依托10G网络架构运营。然而,为了适应AI、深度学习、大数据计算等业务的大规模部署需求,下一代数据中心架构正在向25G/100G网络架构转型。在国内,我们已经看到BAT等互联网领军企业实现了这种高带宽网络架构的规模化部署。 构…

Git初始

一)git的介绍: 1)假设现在有一个文档,你的老板要求你针对于这份文件进行修改,进行完成的修改的版本是版本1,接下来是文档2,修改完文档2以后,接下来老板还不同意,于是又有了文档三,文档四&#x…

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…

08_CMDB系统开发二

CMDB系统开发二 一、用户组管理模块 1、展示用户组列表 Django自带了用户表,同时也带了用户组表。他们是多对多关系。用户组模型很简单,和User模型是多对多的关系。用户组顾名思义,就是对用户进行了分组。其作用在权限控制中就是可以批量的…

Python特性之推导式

文章目录 推导式列表推导式数据的过滤 字典推导式集合推导式 推导式 推导式其实可以理解为简易版的for循环,是Python独有的特性,它能够非常简洁的按照某种规则以一个序列推导出另一个新的序列,也可以理解为是切片的升级 列表推导式 列表的…

vCenter HA拆分和部署

原创作者:运维工程师 谢晋 vCenter HA拆分和部署 拆分vCenter HA部署vCenter HA 拆分vCenter HA 客户vCenter HA内一台虚拟机出现故障无法连接,报错如下: 点击移除集群报错如下: 查找官方KB,按照官方KB进行移除…

Scratch:让少儿编程变得简单有趣

在21世纪这个信息化、数字化的时代,编程已经成为一种重要的技能。然而,对于许多孩子来说,编程可能是一种难以理解和掌握的技能。那么,有没有一种方法,可以让孩子们在轻松愉快的环境中学习编程呢?答案是肯定…