对于QT的图像来说,旋转并不是一个简单的函数,从实现来说,都相对复杂

实现旋转的两种方法

1.使用图像矩阵运算

QPixmap rotateImageWithTransform(const QPixmap &src, int angle)
{QMatrix matri;//迁移到中心matri.translate(src.width()/2.0,src.height()/2.0);//中心旋转matri.rotate(angle);//回退中心matri.translate(-src.width()/2.0,-src.height()/2.0);//执行坐标映射变化//旋转后图像大小变化了 需要提前进行裁剪 如果在旋转后裁剪//则需要计算使用三角函数计算//中心偏移int cubeWidth = qMin(src.width(),src.height());QRect cubeRect(0,0,cubeWidth,cubeWidth);cubeRect.moveCenter(src.rect().center());qDebug()<<" cube "<<cubeRect<<" src rect "<<src.rect();auto retImg = src.copy(cubeRect);retImg = retImg.transformed(matri,Qt::SmoothTransformation);return retImg;
}

上面的代码,如果没有中间的矩形裁剪,则图像大小会按照对角线的变化而变化,除非是放在label中心,且label比他大很多,否则会出现晃动的感觉

2.使用Qt绘制

QPixmap rotateImageWithPainter(const QPixmap &src, int angle)
{QPixmap pix(src.size());QPainter painter(&pix);painter.setBrush(Qt::transparent);painter.setPen(Qt::red);auto srcRect = src.rect();painter.translate(srcRect.center());painter.rotate(angle);int cubeWidth = qMin(src.width(),src.height())/2;painter.drawEllipse(QPoint(0,0),cubeWidth,cubeWidth);//方法1  -Point(1,1)是因为画笔宽度存在偏差//painter.drawPixmap(-srcRect.center()-QPoint(1,1),src);//方法2painter.translate(-srcRect.center());painter.drawPixmap(QPoint(-1,-1),src);return pix;
}

上述代码中,核心的是移动画笔后旋转之后再回来,而绘制的时候,如果使用默认画笔的宽度1,则需要缩回一个像素,否则中心会出现轻微偏移

看实现的效果

左边为原图缩放,右边上图为图像自己旋转,图像保存着原始的数据,右侧下图为绘制旋转,图像底色受画笔控制,可以实现透明

再看非正方形的图像旋转,因为图像变换之前做了图像裁剪,保证了中心,二绘制的图像没有裁剪,只是绘制了矩形能够框住的区域,因此丢失了,但是本身图像旋转如果是做成动画,绘制是不错的选择;

好了,最后附上自己的简单代码,提供参考

源码

Qt图像中心旋转的两种方法相关推荐

  1. qt 加载 图片旋转_QT 实现图片旋转的两种方法

    第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...

  2. win10关闭“Windows安全中心”功能的两种方法

    win10系统怎么将windows安全中心关闭? 听语音 原创 | 浏览:10407 | 更新:2020-03-24 10:54 1 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全 ...

  3. Qt中定时器使用的两种方法

    Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...

  4. hdmi 屏幕旋转 树莓派_树莓派屏幕旋转的两种方法

    标题中的两种方法,实际是对应两种情况.之所以存在两种情况,原因在于现在的(2018.2.4)的raspbian之中,存在一个实验性质的openGL驱动,该驱动能够提供更好的图形性能,但是暂时还不稳定. ...

  5. Qt实现环形缓冲区的两种方法

    目录 一.使用QList和QByteArray ​编辑二.使用QSemaphore 一个环形buffer,在尾部追加数据,从头部读取数据,适合用作IO的缓冲区. 详细介绍可参考:https://en. ...

  6. 旋转视频画面方向,多角度旋转的两种方法

    由于各种原因,有时候我们的视频方向可能不大正确,或者想对视频方向进行旋转调整,该怎么实现呢?下面随小编一起来试试. 方法1:顺时90度 运行视频剪辑高手,将多段视频导入,一行导入一个 在"新 ...

  7. 【Android】android开发---实现屏幕旋转的两种方法

    前言 为实现播放器全屏竖屏切换,还可锁住横屏,解锁后又可以跟随传感器变化. 正文 方法一:通过控制android:screenOrientation属性控制横竖屏 1.使用 SCREEN_ORIENT ...

  8. 图像对比度提高的两种方法

    参考Opencv 2计算机视觉编程手册 提高对比度方法一:使用查找表修改图像外观 可以很方便的实现一些想要的变化: 例如,针对一些图像暗部细节多的情况,设计一个查找表,将暗部细节分配更多的色彩空间,使 ...

  9. java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法

    首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...

  10. qt连接mysql数据库原理_Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

最新文章

  1. 使用pipeline的函数
  2. 九、Swift对象存储服务(双节点搭建)
  3. 使用C++访问MySQL数据库(VS2019)
  4. Swift之源码编译的环境搭建和编译流程
  5. [react] 怎么防止HTML被转义?
  6. 代码重构之道,重构即重生,让你的代码起死回生
  7. C#中常用的文件操作方法
  8. spring与springmvc父子容器
  9. 【卡号识别】基于matlab CNN银行卡数字识别【含Matlab源码 030期】
  10. python编写命令行框架_Python2和3的面向命令的命令行框架是什么?
  11. 中文核心期刊目录总览
  12. Excel 技术篇-使用excel启用宏提示:“可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用“问题解决方法
  13. 企业组织结构中的几种关系
  14. 遗传算法(Genetic Algorithm)解析
  15. Java程序设计-实验6-sdust
  16. 点云配准之NDT算法
  17. 计算机安装Hp1005打印机,如何安装hp1005打印机驱动程序_安装步骤是什么
  18. execjs 调用js出现找不到windows对象
  19. Ubuntu中使用RoboMongo实现MongoDB的可视化
  20. Android MVVM框架搭建(三)MMKV + Room + RxJava2

热门文章

  1. 深度学习中评估指标:准确率Accuracy、召回率Recall、精确率Precision、特异度(真阴性率)和误报率、灵敏度(真阳性率)和漏报率、F1、PR、ROC、AUC、Dice系数、IOU
  2. 服务器宽带估算及选择
  3. 图像特征——纹理特征
  4. 光电编码器的原理及应用场合_光电编码器原理及应用电路
  5. vue3.0脚手架的搭建
  6. ie浏览器文档模式设置
  7. Python批量处理图片转换为灰色图片
  8. 优酷 DSP 广告投放系统架构实践
  9. Excel 中 IRR 函数
  10. 100个特别的遥感应用和用途