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绘图之绘制图像(二)相关推荐

  1. Qt 2D绘图(5):绘制图像基础

    Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...

  2. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  3. 【Qt】2D绘图之绘制图片

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...

  4. 【Qt】2D绘图之绘制路径

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制简单路径 04. 复制图形路径 05. 位置问题探讨 06. 附录 01. 概述 如果要绘制一个复杂的图形,尤其是要重 ...

  5. 【Qt】2D绘图之绘制文字

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 基本绘制 04. 使用范围绘制文字 05. 使用字体绘制文字 06. 附录 01. 概述 Qt中除了绘制图形以外,还可以使 ...

  6. 【Qt】2D绘图之绘制简单的图形

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...

  7. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  8. Qt中国象棋一—— Qt 2D 绘图入门

    最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下.查了一些网上的资料,在此总结一下:我比较喜欢的方式是用到什么学什么,或者自己想做一个东西, ...

  9. 【图像处理】Qt+OpenCV自制mini软件——图像二值化器

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前段时间杂事很多,这几天突然觉得自己有段时间没有碰Qt了,手有点生了.心血来潮,花了两 ...

最新文章

  1. JDBC学习DayTwo
  2. 关于preg_match() / preg_replace()函数的一点小说明
  3. 朝文夕拾系列II---横向型VS垂直型,我所知道的O2O
  4. python用户输入一行字符串_python字符串练习
  5. C#中如何获取鼠标及控件的位置坐标(相对于屏幕)
  6. swagger + springboot 传递 List参数解决
  7. 微服务升级优点_SpringCloud微服务架构升级总结
  8. 万字长文带你解析23 个问题 TCP 疑难杂症!
  9. 如何理解 Spring AOP 以及使用 AspectJ?
  10. 几何畸变图像恢复 openCV3 - 数字图像处理作业3
  11. Android API 中文 (54) —— Filterable
  12. java物流管理系统_JAVA语言的物流管理系统的设计和实现.doc
  13. Sqlmap Tamper编写
  14. linux kill一个进程杀不掉怎么解决?
  15. 嵌入式开发之路(偏汽车电子嵌入式软件工程师学习路线图)
  16. 2022前端都考察些什么
  17. vue进阶:基于vue-cli3.x创建项目(搭建手脚架)
  18. python实现Rot古典密码加解密
  19. 应用数据库软件的典型架构有哪些
  20. 全球与中国汽车气动舒适座椅系统市场深度研究分析报告

热门文章

  1. 三个变量中怎么找出中间值_一文理解神经网络中的偏差和方差
  2. 计算机操作系统安装实验报告,计算机操作系统实验报告.doc
  3. 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...
  4. thymeleaf 中文_springboot 整合 thymeleaf(上手即用)
  5. 投影参数_投影仪参数怎么看?没搞懂之前千万不要买
  6. Windows2012中安装域控(DC) + SQL Server 2014 + TFS 2015
  7. 【Spring源码分析】Bean加载流程概览
  8. 轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
  9. CentOS7 设置主机名及IP映射
  10. python中 __init__.py的例程