Qt中图片旋转缩放操作

在我们开发过程中,难免会遇到加载图片的问题,在上一个开发项目里我就遇到了图片缩放的问题,所以,我决定将这一部分好好研究,记录下来,希望对大家有帮助哟~

在讲解之前,我们先看一看具体的展示效果,有没有你需要的功能?如果有,那就继续跟着我的思路走吧~

功能实现

具体的功能分成了两类:旋转、缩放

1:图片加载

说到了图片旋转,第一个需要讲述的功能是:打开文件并加载图片资源。效果图右侧是采用QLabel控件进行图片加载。

打开文件并选择指定图片路径这个功能就不用再过多说明了,前两章节文章都有进行说明,只是采用了QFileDialog::getOpenFileName静态函数。

在图片加载功能中,唯一需要说明的是QLabel加载图片资源,代码如下:

m_qsPicturePath = qsFilePath;
QImage img(qsFilePath);
ui.labPng->setPixmap(QPixmap::fromImage(img));

代码说明:

qsFilePath:读取出来的选择路径,并将该字符串赋值给m_qsPicturePath进行记录。

为什么要将该路径进行赋值呢?

对于后续不同的功能,每改变一次都需要将QImage重新设置到QLabel控件中,当前,也可以采取QImage作为成员变量,这里就随意了。

接下来就重点讲解旋转以及缩放这两个功能了。在Qt中实现二维转换功能有两种方式,分别是:QMatrix、QTransform两个类。

在书本上介绍的时候一般都是以QMatrix类为主,实际上该类已经过时了,提供它是为了保持旧源代码的工作,并且强烈建议不要在新代码中使用它。

This class is obsolete.It is provided to keep old source code working. We strongly advise against using it in new code

在相同实现功能的方式下,一般会采用QTransform类进行实现的。在Qt中QTransform是推荐的转换类。

QTransform与QMatrix的区别

它是一个真正的3x3矩阵,允许透视变化。 QTransform的toAffine()方法允许将QTransform转换为QMatrix,如果在矩阵上指定了透视图转换,那么转换将导致数据丢失。

2:旋转

首先我们先讲述下旋转功能是如何实现的。

在这个demo中,分别进行了4个角度的旋转,0°、90°、180°、270°

无论是哪个角度进行转换,都采用QTranform::rotate函数实现的。

代码展示:

QTransform transform;
transform.rotate(0);
QImage img(m_qsPicturePath);
img = img.transformed(transform);
ui.labPng->setPixmap(QPixmap::fromImage(img));

代码解析:

QTransform::rotate()围绕指定轴逆时针旋转给定角度的坐标轴,并返回对矩阵的引用。

当前的旋转角度是°,大家在使用的时候可以根据自己的角度自行设置,只需要修改rotate的参数就可以了,参数角度是用度数表示的。

有一点需要注意的是:如果将QTransform用于小部件坐标中定义的点,旋转方向将是顺时针的,因为Y轴指向下方。

既然提到了QMatrix类,那么使用该类是如何实现的呢?

QMatrix matrix;
matrix.rotate(90);
QImage img(m_qsPicturePath);
img = img.transformed(matrix);
ui.labPng->setPixmap(QPixmap::fromImage(img));

3:缩放

代码展示:

QTransform transform;
transform.scale(2, 2);
QImage img(m_qsPicturePath);
img = img.transformed(transform);
ui.labPng->setPixmap(QPixmap::fromImage(img));

代码解析:

QTransform::scale()水平方向按sx和垂直方向按sy缩放坐标系统,并返回对矩阵的引用。

对于scale的参数,可以简单的理解:想要实现放大功能,参数大于1,想要实现缩放功能,参数小于1

当前例子代码对图片进行了两倍放大,假设要是缩放,只需要设置成:transform.scale(0.5, 0.5);

注意:当参数是(1,1)时,说明图片既没有放大也没有缩小。

QMatrix的调用方式一致,只是类名换了,调用的参数名都是一致的,转换角度那里已经写明了使用方式,这里就不再过多说明了。因为QMatrix是Qt中遗弃掉的功能,以后大家都使用QTransform类就可以了。

总结

到这里,旋转缩放的功能就已经实现了。

在这个小demo中,难度不大,最值得记录的是使用哪个类进行操作,在Qt中QTranform的是被推荐的,只要好好读懂类参数,就能实现简单的图形转换操作,如果有想要了解这两个类的详细说明的,下面我会把链接贴出来,具体的函数操作大家可以自行学些

QTransform类详情

QMatrix类详情

我是糯诺诺米团,一名C++开发程序媛~

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

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

相关文章

Java反射篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、除了使用new创建对象之外,还可以用什么方法创建对象?二、Java反射创建对象效率高还是通过new创建对象的效率高?三、java反射的作用四、哪里会用到反射机制?五、反射的实现方式:前言 前些天发现了一个巨牛的人工智能学习网站,…

阿里云配置服务器详细指南

阿里云服务器配置怎么选择合适?CPU内存、公网带宽和ECS实例规格怎么选择合适?阿里云服务器网aliyunfuwuqi.com建议根据实际使用场景选择,例如企业网站后台、自建数据库、企业OA、ERP等办公系统、线下IDC直接映射、高性能计算和大游戏并发&…

OJ练习第188题——队列中可以看到的人数

队列中可以看到的人数 力扣链接&#xff1a;1944. 队列中可以看到的人数 题目描述 示例 解题思路&#xff08;单调栈&#xff09; 分析图例可以发现&#xff0c;第 0个人可以看到的三个人的身高是严格递增的。如果满足 i<j&#xff0c;此时下标为 jjj 且靠后的人比下标为…

亚马逊新品推广的三种方法是什么?广告排名跟哪些因素有关?

亚马逊新品推广的三种方法是什么&#xff1f; 促销活动&#xff1a;新品上市时&#xff0c;可以通过促销活动吸引消费者的关注和购买欲望。例如&#xff0c;提供限时折扣、买一送一、赠品等促销方式&#xff0c;吸引消费者尝试新品。 社交媒体营销&#xff1a;利用社交媒体平…

零售EDI:Metro EDI项目案例

麦德龙Metro 总部位于杜塞尔多夫&#xff0c;在全球范围内经营批发和零售业务。在2018/2019 财年&#xff0c;麦德龙Metro 的全球销售额约为 270 亿欧元。从2016年开始&#xff0c;麦德龙Metro就开始对其当时约230家门店和20,000多家分销合作伙伴进行数字化整合&#xff0c;借助…

电商API接口——你搭建电商独立站电商应用的左膀右臂

当我们构建电商网站或应用时&#xff0c;常常需要获取淘宝商品的详细信息。为了实现这个功能&#xff0c;我们可以利用淘宝提供的开放平台API接口来获取商品数据。在这篇文章中&#xff0c;我们将学习如何设计一个商品详情API接口&#xff0c;并提供相应的代码示例。 首先&…

移动神器RAX3000M路由器不刷固件变身家庭云之五(高级应用):设置成maven私服

由于我们项目经常会使用一些自研的公共组件&#xff0c;把这些组件放在一个共同的maven私服&#xff0c;这样大家就可以自动下载这些组件了。 前面文章里&#xff0c;我们设置好了uhttpd和vsftpd两个服务&#xff0c;http服务把管理界面移到隐藏的子目录里了。 现在我们可以把…

vivado non-project

https://www.xilinx.com/video/hardware/using-the-non-project-batch-flow.html --video https://cloud.tencent.com/developer/article/1169476 bd related run_my_design.tcl 交互模式 start_gui stop_gui

【RabbitMQ】1 消息中间件MQ概述

目录 什么是消息中间件为什么使用消息中间件流量削峰应用解耦异步处理 主流消息中间件及选型选取原则RabbitMQRocketMQKafka如何选择 消息中间件应用场景电商秒杀案例拉勾B端C端数据同步案例支付宝购买电影票 什么是消息中间件 维基百科对消息中间件的解释&#xff1a;面向消息…

Android11 Framework Vendor下自定义系统服务

Android11 Framework Vendor下自定义系统服务_android vendor app 配置-CSDN博客

利用GitHub开源项目ChatGPTNextWeb构建属于自己的ChatGPT - Docker

Docker部署ChatGPTNextWeb ChatGPTNextWeb项目github开源地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 根据文档部署ChatGPTNextWeb 文档地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web/blob/main/README_CN.md 步骤一&#…

Pytorch框架学习笔记

官网- PyTorch Tensor 构造随机初始化矩阵 xtorch.rand(5,3) 构造全0矩阵&#xff0c;数据类型为long xtorch.zeros&#xff08;5,3,dtypetorch.long&#xff09; 获取维度信息 x.size(&#xff09; tensor加法 torch.add&#xff08;x&#xff0c;y&#xff09; xy y…

C语言-蓝桥杯2023年第十四届省赛真题-砍树

题目描述 给定一棵由 n 个结点组成的树以及 m 个不重复的无序数对 (a1, b1), (a2, b2), . . . , (am, bm)&#xff0c;其中 ai 互不相同&#xff0c;bi 互不相同&#xff0c;ai ≠ bj(1 ≤ i, j ≤ m)。 小明想知道是否能够选择一条树上的边砍断&#xff0c;使得对于每个 (a…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了&#xff0c;经过几个月的研发&#xff0c;在原有的视频流分析的基础上&#xff0c;我们终于支持大家都非常期待的图片分析功能了&#xff0c;图片分析的功能加上&#xff0c;能有利于很多场景的展开&#xff0c;比如在烟火、明厨亮…

Coppeliasim--V-rep

官网 学习网站 英文手册 中文手册 coppeliasim ubuntu下载和配置 Windows的可以直接在官网下载&#xff0c;安装教程简单。

图像预处理——transforms

一、transforms 运行机制 torchvision是PyTorch的一个扩展库&#xff0c;提供了许多计算机视觉相关的工具和功能。下面是关于torchvision中常用模块的介绍&#xff1a; torchvision.transforms&#xff1a;提供了一系列常用的图像预处理方法&#xff0c;用于对图像进行变换、…

基于springboot+vue网吧管理系统(程序+数据库+文档)

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;摘 要 随着信息技术和网络技术的…

Java equals 和 == 有什么区别?

equals 和 的区别如下&#xff1a; 功能不同&#xff1a; “ ” 用于比较两个对象的引用是否相等。它比较两个对象的存储地址&#xff0c;即判断两个对象是否是同一个对象。&#xff08;简单理解为&#xff1a;比的地址值&#xff09; “equals” 用于比较两个对象的内容是否…

STM32CubeMX教程19 I2C - MPU6050驱动

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

AtCoder ABC189

这套题值得写一写&#xff0c;从C题开始就很有技巧 C - Mandarin Orange 给定一个数组 a 1 . . . . . a n a_1.....a_n a1​.....an​ 对于每个 a i a_i ai​&#xff0c;找到其左边第一个比他小的位置 l i , a l i < a i l_i,a_{l_i}<a_i li​,ali​​<ai​&#x…