Epic Moments 03(Qt图片缩放)

Q:Qt在做大图缩略图的时候无论使用FastTransformation还是SmoothTransformation都会很慢,如何解决?

 

Problem Description:在加载1080P及以上分辨率的视频的缩略图的时候会感觉到明显的卡顿。虽然该方法无法完美解决卡顿,但是毕竟有速度上的提高,所以记录一波。原始代码敬上:

        img = QImage(static_cast<const unsigned char*> (frame.data),
                     frame.cols,
                     frame.rows,QImage::Format_RGB888).rgbSwapped().scaled(ui->videoEditingArea->width(),
                                                                           ui->videoEditingArea->height(),
                                                                           Qt::KeepAspectRatio,
                                                                           Qt::FastTransformation);

 

A:

QImage提供了缩放图片的函数 scaled, 并且可以用参数指定”快速缩放(FastTransformation)”还是”平滑缩放(SmoothTransformation)”, 使用还是很方便的。 但是如果你用缩放函数去做大图片的缩略图可能会发现”快速缩放”得到的图片质量不佳, 而”平滑缩放”质量很好但速度欠佳, 特别是原图非常大的时候smoothscale简直就是个噩梦阿。 这里就可以使用被称为“Cheat Scaling”的缩小图片的技巧了, 那就是先使用”快速缩放”得到一个中等大小的图片以获得较快的缩放速度, 再使用”平滑缩放”缩小至需要的大小以获得较好的图片质量。

如下代码:

QImage result = img.scaled(800, 600).scaled(200, 150, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); 

一个公认比较好的方法是,先缩至缩略图4倍大小, 再进一步平滑缩放。 按照原作者的测试, 该算法甚至比“快速缩放”还要略快, 却能获得和“平滑缩放”极其接近的最终结果。(原文链接:https://blog.csdn.net/sylwlw/article/details/7732038

修改后代码如下:

QImage preTmp = QImage(static_cast<const unsigned char*> (previewList.at(j).data),
                                       previewList.at(j).cols,
                                       previewList.at(j).rows,QImage::Format_RGB888).rgbSwapped().scaled(640,360).scaled(ui->preFrame0->width(),
                                                                                             ui->preFrame0->height(),
                                                                                             Qt::KeepAspectRatio,
                                                                                             Qt::SmoothTransformation);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值