Qt图像中心旋转的两种方法
对于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图像中心旋转的两种方法相关推荐
- qt 加载 图片旋转_QT 实现图片旋转的两种方法
第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...
- win10关闭“Windows安全中心”功能的两种方法
win10系统怎么将windows安全中心关闭? 听语音 原创 | 浏览:10407 | 更新:2020-03-24 10:54 1 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全 ...
- Qt中定时器使用的两种方法
Qt中定时器的使用有两种方法,一种是使用QObject类提供的定时器,还有一种就是使用QTimer类. 其精确度一般依赖于操作系统和硬件,但一般支持20ms.下面将分别介绍两种方法来使用定时器. 方法 ...
- hdmi 屏幕旋转 树莓派_树莓派屏幕旋转的两种方法
标题中的两种方法,实际是对应两种情况.之所以存在两种情况,原因在于现在的(2018.2.4)的raspbian之中,存在一个实验性质的openGL驱动,该驱动能够提供更好的图形性能,但是暂时还不稳定. ...
- Qt实现环形缓冲区的两种方法
目录 一.使用QList和QByteArray 编辑二.使用QSemaphore 一个环形buffer,在尾部追加数据,从头部读取数据,适合用作IO的缓冲区. 详细介绍可参考:https://en. ...
- 旋转视频画面方向,多角度旋转的两种方法
由于各种原因,有时候我们的视频方向可能不大正确,或者想对视频方向进行旋转调整,该怎么实现呢?下面随小编一起来试试. 方法1:顺时90度 运行视频剪辑高手,将多段视频导入,一行导入一个 在"新 ...
- 【Android】android开发---实现屏幕旋转的两种方法
前言 为实现播放器全屏竖屏切换,还可锁住横屏,解锁后又可以跟随传感器变化. 正文 方法一:通过控制android:screenOrientation属性控制横竖屏 1.使用 SCREEN_ORIENT ...
- 图像对比度提高的两种方法
参考Opencv 2计算机视觉编程手册 提高对比度方法一:使用查找表修改图像外观 可以很方便的实现一些想要的变化: 例如,针对一些图像暗部细节多的情况,设计一个查找表,将暗部细节分配更多的色彩空间,使 ...
- java 把图片插入窗体,JAVA JFrame窗体添加背景图像的两种方法
首先还是要了解框架JFrame中的层次结构.JFrame中的层次分布及相对关系是:最底层是:JRootPane:第二层是:JlayerPane:最上层就是ContentPane,也正是我们常说的内容面 ...
- qt连接mysql数据库原理_Qt连接数据库的两种方法
我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...
最新文章
- 使用pipeline的函数
- 九、Swift对象存储服务(双节点搭建)
- 使用C++访问MySQL数据库(VS2019)
- Swift之源码编译的环境搭建和编译流程
- [react] 怎么防止HTML被转义?
- 代码重构之道,重构即重生,让你的代码起死回生
- C#中常用的文件操作方法
- spring与springmvc父子容器
- 【卡号识别】基于matlab CNN银行卡数字识别【含Matlab源码 030期】
- python编写命令行框架_Python2和3的面向命令的命令行框架是什么?
- 中文核心期刊目录总览
- Excel 技术篇-使用excel启用宏提示:“可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用“问题解决方法
- 企业组织结构中的几种关系
- 遗传算法(Genetic Algorithm)解析
- Java程序设计-实验6-sdust
- 点云配准之NDT算法
- 计算机安装Hp1005打印机,如何安装hp1005打印机驱动程序_安装步骤是什么
- execjs 调用js出现找不到windows对象
- Ubuntu中使用RoboMongo实现MongoDB的可视化
- Android MVVM框架搭建(三)MMKV + Room + RxJava2