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绘图之绘制图片相关推荐

  1. 【Qt】2D绘图之绘制图像(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...

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

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

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

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

  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绘图功能简单总结

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

  7. 小程序canvas 2d 绘图无法drawImage图片?

    小程序canvas 2d 绘图无法drawImage图片? 微信iOS 7.0.20 版本 使用canvas 2d 绘制drawImage时无法成功绘制,图片不显示,img1.onload不执行,执行 ...

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

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

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

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

最新文章

  1. 爆款入门 | 微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)
  2. 史上最全的长读长数据校错方法大比拼
  3. POJ 3691 DNA repair AC自动机 + DP
  4. asp.net DBHelper类
  5. Linux基础之-网络配置,主机名设置,ssh登陆,scp传输
  6. chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...
  7. 使用WSO2 ESB进行邮件内容过滤
  8. 想学大数据,应该从什么语言开始学?
  9. POJ 2054 Color a Tree#贪心(难,好题)
  10. 重复可记,证明没有忘记这回事
  11. android adb进入recovery模式,adb 进入 recovery adb 进入 bootloader
  12. 游戏美术-魔兽世界查看器的正确使用方法
  13. 关于fat32分区32g限制的问题
  14. 苹果中国全系降价:iphone最高降500元,用户可退差价
  15. Mac下Brew 卸载MySql以及安装Mysql 阿星小栈
  16. 热红外探测器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. ffmpeg 编码器AVCodecContext 的配置参数
  18. 地理生物结业考_不到30天,初二学年地理、生物结业考试开考,老师们说……...
  19. 计算机简历800字,我的简历作文800字
  20. 复旦大学《数学分析》教学大纲,读后有感

热门文章

  1. 理解Java的封装与接口
  2. secureCRT 小技巧
  3. 光脚丫学LINQ(005):数据表之间的联接查询
  4. centos6.8安装php7.3,CentOS7.6源码编译安装PHP 7.3.8
  5. Java黑皮书课后题第7章:*7.33(文化:中国生肖)使用一个字符串数组存储动物名称来简化程序清单3-9的程序
  6. 阿里巴巴集团2014秋季校园招聘笔试题
  7. 程序员面试100题之十二:求数组中最长递增子序列
  8. SQL Server 中系统视图sysobjects中type字段的说明
  9. 06-机器学习.数据分析.数据挖掘的区别于联系
  10. Python __dict__和vars()