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);

    //方法2
    painter.translate(-srcRect.center());
    painter.drawPixmap(QPoint(-1,-1),src);


    return pix;
}

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

 

看实现的效果

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

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

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

源码

 

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值