【Qt】2D绘图之绘制图像(二)
00. 目录
文章目录
- 00. 目录
- 01. 概述
- 02. 开发环境
- 03. 绘制QImage图像
- 04. 绘制QPixmap图像
- 05. 绘制QPicture图像
- 06. 综合对比
- 07. 附录
01. 概述
Qt提供了四个类来处理图像数据:QImage、QPixmap、QBitmap和QPicture,它们也都是常用的绘图设备。
- QImage主要用来进行I/O处理,它对I/O处理操作进行了优化,而且也可以用来直接访问和操作像素;
- QPixmap主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;
- QBitmap是QPixmap的子类,它是一个便捷类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;
- QPicture用来记录并重演QPainter命令。
02. 开发环境
Windows系统:Windows10
Qt版本:Qt5.15或者Qt6
03. 绘制QImage图像
QImage类提供了一个与硬件无关的图像表示方法,可以直接访问像素数据,也可以作为绘图设备。
因为QImage是QPaintDevice的子类,所以QPainter可以直接在QImage对象上进行绘制。当在QImage上使用QPainter时,绘制操作会在当前GUI线程以外的其他线程中执行。
QImage支持的图像格式包含了单色、8位、32位和alpha混合格式图像。QImage提供了获取图像各种信息的相关函数,还提供了一些转换图像的函数。
QImage使用了隐式数据共享,所以可以进行值传递,QImage对象还可以使用数据流或者进行比较。
Qt支持的图像格式
程序示例
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QImage image;//加载一张图片image.load(":/image/a.png");//输出图片相关信息qDebug() << image.size() << " " << image.format() << " " << image.depth();//在界面上绘制图片painter.drawImage(QPoint(10, 10), image);//获取镜像图片QImage mirror = image.mirrored();//将图片进行扭曲QTransform transform;transform.shear(0.2, 0);QImage image2 = mirror.transformed(transform);painter.drawImage(QPoint(10, 160), image2);//将图片保存到当前文件中image2.save("./mirror.png");
}
运行结果
04. 绘制QPixmap图像
QPixmap可以作为一个绘图设备将图像显示在屏幕上。QPixmap中的像素在内部由底层的窗口系统来进行管理。因为QPixmap是QPaintDevice的子类,所以QPainter也可以直接在它上面进行绘制。要想访问像素,只能使用QPainter的相应函数,或者将QPixmap转换为QImage。而与QImage不同,QPixmap中的fill()函数可以使用指定的颜色初始化整个pixmap图像。
可以使用toImage()和fromImage()函数在QImage和QPixmap之间进行转换。通常情况下,QImage类用来加载一个图像文件,随意操纵图像数据,然后将QImage对象转换为QPixmap类型再显示到屏幕上。当然,如果不需要对图像进行操作,那么也可以直接使用QPixmap来加载图像文件。与QImage不同,QPixmap依赖于具体的硬件。QPixmap类也是使用隐式数据共享,可以作为值进行传递。
QPixmap可以很容易的使用QLabel或QAbstractButton的子类(比如QPushButton)来显示在屏幕上。QLabel拥有一个pixmap属性,而QAbstractButton拥有一个icon属性。我们还可以使用grabWidget()和grabWindow()等静态函数来实现截屏功能,使用mask()等函数实现遮罩效果。
程序示例
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pix;pix.load(":/image/b.png");painter.drawPixmap(0, 0, pix.width(), pix.height(), pix);painter.setBrush(QColor(255, 255, 255, 100));painter.drawRect(0, 0, pix.width(), pix.height());painter.drawPixmap(100, 0, pix.width(), pix.height(), pix);painter.setBrush(QColor(0, 0, 255, 100));painter.drawRect(100, 0, pix.width(), pix.height());}
运行结果
05. 绘制QPicture图像
QPicture是一个可以记录和重演QPainter命令的绘图设备。QPicture可以使用一个平台无关的格式(.pic格式)将绘图命令序列化到IO设备中,所有可以绘制在QWidget部件或者QPixmap上的内容,都可以保存在QPicture中。QPicture与分辨率无关,在不同设备上的显示效果都是一样的。要记录QPainter命令,可以像如下代码这样进行:
void Widget::paintEvent(QPaintEvent *)
{QPicture picture;QPainter painter;//记录Qpainter命令painter.begin(&picture);painter.drawEllipse(10, 20, 80, 70);painter.end();picture.save("draw.pic");//重演QPainter命令picture.load("draw.pic");painter.begin(this);painter.drawPicture(0, 0, picture);painter.end();}
运行结果
06. 综合对比
程序示例
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);//绘制imageQImage image(100, 100, QImage::Format_ARGB32);painter.begin(&image);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("Image"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//绘制pixmapQPixmap pixMap(100, 100);painter.begin(&pixMap);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("Pixmap"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//绘制bitmapQBitmap bitMap(100, 100);painter.begin(&bitMap);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("bitMap"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();//绘制PicutureQPicture picture;painter.begin(&picture);painter.setPen(QPen(Qt::green, 3));painter.setBrush(Qt::yellow);painter.drawRect(10, 10, 60, 60);painter.drawText(10, 10, 60, 60, Qt::AlignCenter, tr("QPicture"));painter.setBrush(QColor(0, 0, 0, 100));painter.drawRect(50, 50, 40, 40);painter.end();painter.begin(this);painter.drawImage(50, 20, image);painter.drawPixmap(200, 20, pixMap);painter.drawPixmap(50, 170, bitMap);painter.drawPicture(200, 170, picture);painter.end();
}
运行结果
07. 附录
源码下载:【Qt】2D绘图之绘制图像(二).rar
【Qt】2D绘图之绘制图像(二)相关推荐
- Qt 2D绘图(5):绘制图像基础
Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- 【Qt】2D绘图之绘制图片
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...
- 【Qt】2D绘图之绘制路径
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制简单路径 04. 复制图形路径 05. 位置问题探讨 06. 附录 01. 概述 如果要绘制一个复杂的图形,尤其是要重 ...
- 【Qt】2D绘图之绘制文字
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 基本绘制 04. 使用范围绘制文字 05. 使用字体绘制文字 06. 附录 01. 概述 Qt中除了绘制图形以外,还可以使 ...
- 【Qt】2D绘图之绘制简单的图形
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...
- Qt 2D绘图功能简单总结
文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...
- Qt中国象棋一—— Qt 2D 绘图入门
最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下.查了一些网上的资料,在此总结一下:我比较喜欢的方式是用到什么学什么,或者自己想做一个东西, ...
- 【图像处理】Qt+OpenCV自制mini软件——图像二值化器
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前段时间杂事很多,这几天突然觉得自己有段时间没有碰Qt了,手有点生了.心血来潮,花了两 ...
最新文章
- JDBC学习DayTwo
- 关于preg_match() / preg_replace()函数的一点小说明
- 朝文夕拾系列II---横向型VS垂直型,我所知道的O2O
- python用户输入一行字符串_python字符串练习
- C#中如何获取鼠标及控件的位置坐标(相对于屏幕)
- swagger + springboot 传递 List参数解决
- 微服务升级优点_SpringCloud微服务架构升级总结
- 万字长文带你解析23 个问题 TCP 疑难杂症!
- 如何理解 Spring AOP 以及使用 AspectJ?
- 几何畸变图像恢复 openCV3 - 数字图像处理作业3
- Android API 中文 (54) —— Filterable
- java物流管理系统_JAVA语言的物流管理系统的设计和实现.doc
- Sqlmap Tamper编写
- linux kill一个进程杀不掉怎么解决?
- 嵌入式开发之路(偏汽车电子嵌入式软件工程师学习路线图)
- 2022前端都考察些什么
- vue进阶:基于vue-cli3.x创建项目(搭建手脚架)
- python实现Rot古典密码加解密
- 应用数据库软件的典型架构有哪些
- 全球与中国汽车气动舒适座椅系统市场深度研究分析报告
热门文章
- 三个变量中怎么找出中间值_一文理解神经网络中的偏差和方差
- 计算机操作系统安装实验报告,计算机操作系统实验报告.doc
- 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...
- thymeleaf 中文_springboot 整合 thymeleaf(上手即用)
- 投影参数_投影仪参数怎么看?没搞懂之前千万不要买
- Windows2012中安装域控(DC) + SQL Server 2014 + TFS 2015
- 【Spring源码分析】Bean加载流程概览
- 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
- CentOS7 设置主机名及IP映射
- python中 __init__.py的例程