Qt|图片旋转缩放操作
在我们开发过程中,难免会遇到加载图片的问题,在上一个开发项目里我就遇到了图片缩放的问题,所以,我决定将这一部分好好研究,记录下来,希望对大家有帮助哟~
在讲解之前,我们先看一看具体的展示效果,有没有你需要的功能?如果有,那就继续跟着我的思路走吧~
功能实现
具体的功能分成了两类:旋转、缩放
1:图片加载
说到了图片旋转,第一个需要讲述的功能是:打开文件并加载图片资源。效果图右侧是采用 QLabel 控件进行图片加载。
打开文件并选择指定图片路径这个功能就不用再过多说明了,前两章节文章都有进行说明,只是采用了 QFileDialog::getOpenFileName 静态函数。
在图片加载功能中,唯一需要说明的是 QLabel 加载图片资源,代码如下:
代码说明:
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::rotate()围绕指定轴逆时针旋转给定角度的坐标轴,并返回对矩阵的引用。
当前的旋转角度是°,大家在使用的时候可以根据自己的角度自行设置,只需要修改 rotate 的参数就可以了,参数角度是用度数表示的。
有一点需要注意的是:如果将 QTransform 用于小部件坐标中定义的点,旋转方向将是顺时针的,因为 Y 轴指向下方。
既然提到了 QMatrix 类,那么使用该类是如何实现的呢?
3:缩放
代码展示:
代码解析:
QTransform::scale()水平方向按 sx 和垂直方向按 sy 缩放坐标系统,并返回对矩阵的引用。
对于 scale 的参数,可以简单的理解:想要实现放大功能,参数大于 1,想要实现缩放功能,参数小于 1
当前例子代码对图片进行了两倍放大,假设要是缩放,只需要设置成:transform.scale(0.5, 0.5);
注意:当参数是(1,1)时,说明图片既没有放大也没有缩小。
QMatrix 的调用方式一致,只是类名换了,调用的参数名都是一致的,转换角度那里已经写明了使用方式,这里就不再过多说明了。因为 QMatrix 是 Qt 中遗弃掉的功能,以后大家都使用 QTransform 类就可以了。
总结
到这里,旋转缩放的功能就已经实现了。
在这个小 demo 中,难度不大,最值得记录的是使用哪个类进行操作,在 Qt 中 QTranform 的是被推荐的,只要好好读懂类参数,就能实现简单的图形转换操作,如果有想要了解这两个类的详细说明的,下面我会把链接贴出来,具体的函数操作大家可以自行学些
我是中国好公民 st,一名 C++程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/ec1dac0b85ae47c66dac71d72】。文章转载请联系作者。
评论