分类: 嵌入式
2010-10-30 10:34:01
在Qt Labs Blog里提到了一个快速缩小大图片的方法, 而且作者说是“几乎所有图形程序员都知道的trick”。 大概因为笔者不是图形程序员的缘故, 对这个小技巧十分之陌生, 我想大家可能也有很大一部分人还不知道这个技巧, 特此memo, 希望对大家有用。
QImage提供了缩放图片的函数 scaled, 并且可以用参数指定”快速缩放(FastTransformation)”还是”平滑缩放(SmoothTransformation)”, 使用还是很方便的。 但是如果你用缩放函数去做大图片的缩略图可能会发现”快速缩放”得到的图片质量不佳, 而”平滑缩放”质量很好但速度欠佳, 特别是原图非常大的时候smoothscale简直就是个噩梦阿。 这里就可以使用被称为“Cheat Scaling”的缩小图片的技巧了, 那就是先使用”快速缩放”得到一个中等大小的图片以获得较快的缩放速度, 再使用”平滑缩放”缩小至需要的大小以获得较好的图片质量。
如下代码:
QImage result = img.scaled(800, 600).scaled(200, 150, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
一个公认比较好的方法是,先缩至缩略图4倍大小, 再进一步平滑缩放。 按照原作者的测试, 该算法甚至比“快速缩放”还要略快, 却能获得和“平滑缩放”极其接近的最终结果。(为什么会比“快速缩放”还快呢?我一直想不明白)
下面这个图片是性能测试的结果, bar越长证明越快哦~
另外下图是一个缩放效果的展示, 确实是非常令人满意的结果:
除了这样一个缩放的技巧, 原作者还介绍了另外一个缩放的方法, 叫做“快速减半法”, 原则就是“没有最快, 只有更快!”。
性能测试证明这个方法真是巨快无比, 如果对数学比较明白的同学一定要好好看看那篇文章。 不过笔者数学学的有点那个, 看不太懂, 所以这里就不详细解释该算法的原理了。
如果能将两个算法合理结合, 定能打变天下无敌手, 值得大家学习学习。