Qt中图片旋转缩放操作的实现

 更新时间:2024年01月04日 10:18:28   作者:糯诺诺米团  
本文主要介绍了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类详情

到此这篇关于Qt中图片旋转缩放操作的实现的文章就介绍到这了,更多相关Qt 图片旋转缩放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VS2010 C++ 配置优化方案

    VS2010 C++ 配置优化方案

    使用VS2010的时候,发现了不少问题,而本文则是介绍使用中需要的问题,已经解决方案。
    2014-10-10
  • C++ vector 遍历的几种方法

    C++ vector 遍历的几种方法

    本文主要介绍了C++ vector 遍历的几种方法,对vector 遍历有一定的总结,具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    C语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

    这篇文章主要介绍了C语言中指针 int *p=0;和int *p;*p=0;和”&“有什么关系和区别,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 手把手教你如何一眼分辨是C还是C++

    手把手教你如何一眼分辨是C还是C++

    在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序,下面这篇文章主要给大家介绍了关于如何一眼分辨是C还是C++的相关资料,需要的朋友可以参考下
    2023-02-02
  • CMake中使用vcpkg的实现

    CMake中使用vcpkg的实现

    本文主要介绍了CMake中使用vcpkg的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • C语言形参和实参传值和传址详解刨析

    C语言形参和实参传值和传址详解刨析

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2021-11-11
  • C语言学生管理系统源码分享

    C语言学生管理系统源码分享

    这篇文章主要为大家分享了C语言学生管理系统的源码,帮助大家学习结构体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 详解C++纯虚函数与抽象类

    详解C++纯虚函数与抽象类

    这篇文章主要介绍了C++纯虚函数与抽象类的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • 深入解析C++和JAVA的字符串

    深入解析C++和JAVA的字符串

    这篇文章主要介绍了C++和JAVA的字符串,JAVA 中String 和StringBuffer的区别,需要的朋友可以参考下
    2015-07-07
  • C++超集C++/CLI模块的基本类型

    C++超集C++/CLI模块的基本类型

    这篇文章介绍了C++超集C++/CLI模块的基本类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论