qt快速缩放图片却保持精度

    Qt的QImage和QPixmap类都提供了一个scaled方法来缩放图片,该方法有个transformMode参数为缩放所使用的方法,它有两个方法为指定快速缩放(FastTransformation)”还是”平滑缩放(SmoothTransformation)。其中快速缩放速度快但是缩放失真大,平滑缩放失真小但是速度慢,特别是质量较高的图片时,速度非常不理想。

   为此有人说到一个名为"Cheat Scaling"的方法,即先使用快速缩放将图片缩放至原图的四倍,再使用平滑缩放到目标尺寸,速度可以比肩快速缩放但效果可以比肩平滑缩放:

   QImage image(m_backPhoto);
    int i_width  = image.width()  * 4;
    int i_height = image.height() * 4;
    image = image.scaled(800, 600).scaled(m_parent->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

    该作者还给出了一张性能测试表

    但笔者根据该方法测试发现,Cheat Scaling方法确实效果比肩平滑缩放,但速度略慢于快速缩放法,并非上表所示的性能超过快速缩放法,但该速度也是远远超过平滑缩放。

    大家可以看看,左侧After是笔者使用快速缩放方法,右侧Before使用的是Cheat Scaling方法,二者在质量是差距确实很大

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Qt提供了Qt Quick这个强大的库来实现手势缩放和拖拉图片的功能。首先,我们需要在QML页面中创建一个Image元素来显示图片,并设置其source属性为待显示的图片路径。 在实现手势缩放功能时,我们可以使用PinchArea元素。该元素可以识别到用户的手势缩放动作,我们可以在其onPinchUpdated信号的处理函数中实现相应的功能。首先,我们可以通过PinchArea的scale属性获取手势缩放的系数,然后将该系数应用到Image元素的scale属性上,从而实现图片缩放。 同样地,我们也可以通过DragArea元素实现图片的拖拉功能。通过设置DragArea元素作用的区域,我们可以使得用户只能在指定的区域内拖拉图片。在DragArea元素的onPositionChanged信号的处理函数中,我们可以获取到图片拖拉的距离,然后将该距离应用到Image元素的x和y属性上,从而实现图片的拖拉。 除了PinchArea和DragArea外,还可以使用MouseArea元素来实现基于鼠标的手势操作。鼠标的滚轮事件可以用于实现图片缩放,鼠标按下和拖动事件可以用于实现图片的拖拉。 最后,为了实现更好的用户体验,我们还可以在操作过程中添加一些动画效果,比如缩放和拖拉的过渡动画,使得操作更加平滑。 ### 回答2: 在Qt中,可以通过手势识别来实现图片缩放和拖拽功能。首先,需要使用QGraphicsView和QGraphicsScene来显示图片。然后,通过重写QGraphicsView的event事件处理函数来响应手势操作。以下是一个简单的实现示例: ```cpp #include <QGraphicsView> #include <QGraphicsScene> #include <QGestureEvent> #include <QPinchGesture> #include <QGraphicsPixmapItem> class ImageView : public QGraphicsView { public: ImageView(QWidget *parent = nullptr) : QGraphicsView(parent) { // 创建场景和图元 QGraphicsScene *scene = new QGraphicsScene(this); QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem; pixmapItem->setPixmap(QPixmap("image.jpg")); // 加载图片 // 将图元添加到场景中 scene->addItem(pixmapItem); // 设置场景 setScene(scene); // 启用手势 grabGesture(Qt::PinchGesture); grabGesture(Qt::PanGesture); } protected: bool event(QEvent *event) override { if(event->type() == QEvent::Gesture) return gestureEvent(static_cast<QGestureEvent*>(event)); return QGraphicsView::event(event); } bool gestureEvent(QGestureEvent *event) { if (QGesture *gesture = event->gesture(Qt::PinchGesture)) pinchEvent(static_cast<QPinchGesture *>(gesture)); else if (QGesture *gesture = event->gesture(Qt::PanGesture)) panEvent(static_cast<QPanGesture *>(gesture)); return true; } void pinchEvent(QPinchGesture *gesture) { // 缩放图片 QGraphicsPixmapItem *pixmapItem = static_cast<QGraphicsPixmapItem *>(scene()->items().first()); qreal scaleFactor = gesture->scaleFactor(); pixmapItem->setScale(pixmapItem->scale() * scaleFactor); } void panEvent(QPanGesture *gesture) { // 拖拽图片 QGraphicsPixmapItem *pixmapItem = static_cast<QGraphicsPixmapItem *>(scene()->items().first()); QPointF delta = gesture->delta(); pixmapItem->setPos(pixmapItem->pos() + delta); } }; ``` 上述代码创建了一个自定义的ImageView类,继承自QGraphicsView。在该类中,我们重写了event函数来处理手势事件。通过重写gestureEvent函数来判断手势类型,并调用相应的处理函数进行缩放和拖拽操作。其中,pinchEvent函数用于处理缩放手势事件,panEvent函数用于处理拖拽手势事件。通过设置场景和图元使图片显示在界面上,并启用手势识别功能实现缩放和拖拽。 这样,当用户在图片上进行手势缩放或拖拽操作时,图片将根据用户的手势进行相应的变化。 ### 回答3: 在Qt中,我们可以使用手势来实现图片缩放和拖拉功能。首先,我们需要建立一个继承自QGraphicsView的自定义视图类,该视图类用于显示图片。 在该视图类的构造函数中,我们可以设置一些初始参数,如背景颜色、滚动条的显示策略等。接着,我们需要重写一些事件处理函数来处理手势事件。 对于缩放功能,我们可以重写QGraphicsView的wheelEvent函数,当滚轮滚动事件发生时,根据滚轮的方向判断是放大还是缩小,并通过调整视图的缩放因子来实现图片缩放效果。 对于拖拉功能,我们可以重写QGraphicsView的mousePressEvent、mouseReleaseEvent和mouseMoveEvent函数。当鼠标按下时,记录下鼠标的位置,并在移动鼠标时,计算出鼠标的位置的变化值。根据变化值的大小,通过调整视图的水平和竖直滚动条来实现图片的拖拉效果。 在视图类中,我们需要添加一个QGraphicsScene对象,并将该对象与视图关联起来。我们可以在构造函数中加载图片文件,将该图片添加到QGraphicsScene中,然后再将场景与视图关联起来。 最后,在主函数中创建视图对象并显示出来。我们可以通过设置视图对象的大小、背景颜色、图片的位置等参数来定制我们想要的效果。 通过以上的步骤,我们就能够实现在Qt中使用手势来缩放和拖拉图片的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值