Qt运动(线性)模糊

时间:2012-05-20 15:49:40

标签: qt blur motion-blur

是否有简单的解决方案为Qt中的图像添加运动模糊?没有找到任何关于模糊的好教程。我需要一些非常简单的东西,我能理解,如果能改变模糊角度,我会非常好。

1 个答案:

答案 0 :(得分:2)

Qt没有运动模糊滤镜。我查看了QGraphicsBlurEffect的代码;它使用QPixmapBlurEffect,它本身使用一个名为expblur的内部辅助方法(指数模糊)。

expblur本身使用一维模糊效果(X方向的运动模糊,方法qt_blurrow)两次。它将两个模糊之间的图像旋转90度,然后将其旋转回来。

实际上,Qt 具有运动模糊效果,但这只是内部效果。所以你需要写自己的效果。要执行此操作,请查看qt_blurrrow的代码,您可以在src/gui/qpixmapfilter.cpp的Qt源代码中找到该代码。这将为滤镜提供良好的质量,因为它是一个指数模糊滤镜而不是线性滤镜。

如果您不想深入了解Qt源代码,请将此伪代码作为开头:

foreach pixel (x, y) in image {
    for dx = -r to r with x+dx within image {
        for dy = -r to r with y+dy within image {
            Add pixel (x+dx, y+dy) of the source image with ↩
            factor (matrix[dx, dy]) to the target image.
        }
    }
}

其中矩阵可能像这样定义(对于半径为2的水平运动模糊):

0   0   0   0   0
0   0   0   0   0
0.1 0.2 0.4 0.2 0.1
0   0   0   0   0
0   0   0   0   0

请注意,所有条目的总和必须为1,或者您必须将颜色除以矩阵条目的总和。

当您想要允许α的任意角度(不仅是90度步长)时,难以为给定半径r和角度α构建此矩阵。 [编辑:请参见注释3,以便轻松生成此类矩阵。]