【Qt】2D绘图之绘制图片
00. 目录
文章目录
- 00. 目录
- 01. 概述
- 02. 开发环境
- 03. 简单绘制图片
- 04. 平移图片
- 05. 缩放图片
- 06. 旋转图片
- 07. 扭曲图片
- 08. 附录
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. 简单绘制图片
3.1 创建一个Qt Widgets应用,项目名称为11PixMap,在类信息页面,将基类选择为QWidget,类名使用默认的Widget即可。
3.2 项目所在的目录中添加一下几张图片
3.3 头文件中添加重绘事件处理函数的声明
protected:void paintEvent(QPaintEvent *);
3.4 源文件中先添加头文件包含#include ,然后添加函数的定义
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pixmap;pixmap.load("../11Pixmap/image/a.png");painter.drawPixmap(0, 0, 128, 128, pixmap);}
drawPixmap()函数在给定的矩形中来绘制图片,这里矩形的左上角顶点为(0, 0)点,宽128,高128,如果宽高跟图片的大小比例不同,默认会拉伸图片。运行效果如下图所示。
04. 平移图片
QPainter类中的translate()函数实现坐标原点的改变,改变原点后,此点将会成为新的原点(0,0)。
在paintEvent()函数里面继续添加如下代码:
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pixmap;pixmap.load("../11Pixmap/image/a.png");painter.drawPixmap(0, 0, 128, 128, pixmap);painter.translate(150, 150);painter.drawPixmap(0, 0, 128, 128, pixmap);}
这里将(150,150)设置为了新的坐标原点,所以下面在(0,0)点贴图,就相当于在以前的(150,150)点贴图。执行结果如下:
05. 缩放图片
我们可以使用QPixmap类中的scaled()函数来实现图片的放大和缩小。
这里有三个值,只看其示例图片就可大致明白,Qt::IgnoreAspectRatio是不保持图片的宽高比;Qt::KeepAspectRatio是在给定的矩形中保持宽高比;最后一个也是保持宽高比,但可能超出给定的矩形。这里给定的矩形是由我们显示图片时给定的参数决定的
程序示例
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pixmap;pixmap.load("../11Pixmap/image/a.png");painter.drawPixmap(0, 0, 128, 128, pixmap);painter.translate(150, 150);painter.drawPixmap(0, 0, 128, 128, pixmap);qreal width = pixmap.width();qreal height = pixmap.height();//将图片的宽和高都缩小 并且在给定的矩形内保持宽高的比值不变。pixmap = pixmap.scaled(width * 0.2, height * 0.2, Qt::KeepAspectRatio);painter.translate(150, 150);painter.drawPixmap(0, 0, pixmap);
}
执行结果
06. 旋转图片
旋转使用的是QPainter类的rotate()函数,它默认是以原点为中心进行旋转的。如果要改变旋转的中心,可以使用前面讲到的translate()函数完成。
在paintEvent()函数中继续添加如下代码:
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pixmap;pixmap.load("../11Pixmap/image/a.png");painter.drawPixmap(0, 0, 128, 128, pixmap);painter.translate(150, 150);//顺时针旋转90°painter.rotate(90);//恢复原点painter.translate(-150, -150);painter.drawPixmap(150, 150, 128, 128, pixmap);
}
必须先改变旋转中心,然后再旋转,然后再将原点复原,才能达到想要的效果。运行程序,如下图所示。
07. 扭曲图片
实现图片的扭曲,是使用的QPainter类的shear(qreal sh,qreal sv)函数完成的。它有两个参数,前面的参数实现横向变形,后面的参数实现纵向变形。当它们的值为0时,表示不扭曲。
在paintEvent()中继续添加如下代码:
void Widget::paintEvent(QPaintEvent *)
{QPainter painter(this);QPixmap pixmap;pixmap.load("../11Pixmap/image/a.png");painter.drawPixmap(0, 0, 128, 128, pixmap);//横向扭曲painter.shear(0.5, 0);painter.drawPixmap(150, 150, 128, 128, pixmap);
}
执行结果如下:
08. 附录
源码下载:【Qt】2D绘图之绘制图片.rar
【Qt】2D绘图之绘制图片相关推荐
- 【Qt】2D绘图之绘制图像(二)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...
- 【Qt】2D绘图之绘制简单的图形
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...
- Qt 2D绘图(5):绘制图像基础
Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...
- 【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绘图功能简单总结
文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...
- 小程序canvas 2d 绘图无法drawImage图片?
小程序canvas 2d 绘图无法drawImage图片? 微信iOS 7.0.20 版本 使用canvas 2d 绘制drawImage时无法成功绘制,图片不显示,img1.onload不执行,执行 ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- Qt中国象棋一—— Qt 2D 绘图入门
最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下.查了一些网上的资料,在此总结一下:我比较喜欢的方式是用到什么学什么,或者自己想做一个东西, ...
最新文章
- 爆款入门 | 微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)
- 史上最全的长读长数据校错方法大比拼
- POJ 3691 DNA repair AC自动机 + DP
- asp.net DBHelper类
- Linux基础之-网络配置,主机名设置,ssh登陆,scp传输
- chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...
- 使用WSO2 ESB进行邮件内容过滤
- 想学大数据,应该从什么语言开始学?
- POJ 2054 Color a Tree#贪心(难,好题)
- 重复可记,证明没有忘记这回事
- android adb进入recovery模式,adb 进入 recovery adb 进入 bootloader
- 游戏美术-魔兽世界查看器的正确使用方法
- 关于fat32分区32g限制的问题
- 苹果中国全系降价:iphone最高降500元,用户可退差价
- Mac下Brew 卸载MySql以及安装Mysql 阿星小栈
- 热红外探测器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- ffmpeg 编码器AVCodecContext 的配置参数
- 地理生物结业考_不到30天,初二学年地理、生物结业考试开考,老师们说……...
- 计算机简历800字,我的简历作文800字
- 复旦大学《数学分析》教学大纲,读后有感
热门文章
- 理解Java的封装与接口
- secureCRT 小技巧
- 光脚丫学LINQ(005):数据表之间的联接查询
- centos6.8安装php7.3,CentOS7.6源码编译安装PHP 7.3.8
- Java黑皮书课后题第7章:*7.33(文化:中国生肖)使用一个字符串数组存储动物名称来简化程序清单3-9的程序
- 阿里巴巴集团2014秋季校园招聘笔试题
- 程序员面试100题之十二:求数组中最长递增子序列
- SQL Server 中系统视图sysobjects中type字段的说明
- 06-机器学习.数据分析.数据挖掘的区别于联系
- Python __dict__和vars()