有没有简单的解决方案可以在 Qt 中向图像添加运动模糊?还没有找到任何关于模糊的好教程。我需要一些非常简单的东西,我可以理解,如果我可以改变模糊角度,那就太好了。

有帮助吗?

解决方案

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

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

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

如果您不想深入研究 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。]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top