【问题标题】:QML Shader Effect blur behind an item项目后面的 QML 着色器效果模糊
【发布时间】:2015-01-19 19:41:35
【问题描述】:

是否可以模糊另一个项目后面的项目?

示例:模糊图像的一部分(如 qml - parent.centerIn: image)

我想要类似的东西:

Image { id: img
    anchors.fill: parent
    source: "bug.png"

    Item { id: info
        anchors.centerIn: parent
        height: 200
        width: 200

        Text {
            text: "HAMMER TIME"
            color: "white"
        }

        /* BLUR CODE HERE TO BLUR BACKGROUND OF THIS ITEM */
        /* which is a part of "bug.png" image with 200x200 size */
        /* and offset equals to "info.x" and "info.y" */
    }
}

这个问题会影响任何shader effect,因为官方文档没有这个问题的答案,而且我的所有尝试都没有成功 - 只能模糊整个项目,但不能模糊它的一部分。

【问题讨论】:

    标签: javascript qt qml effects


    【解决方案1】:

    这是我的解决方案。此版本仅适用于矩形。 Item ShaderEffectSource 有助于创建这样的源矩形。

    import QtQuick 2.3
    import QtQuick.Window 2.2
    import QtGraphicalEffects 1.0
    
    Window {
        visible: true
        width: 600
        height:600
    
        Image {
            id: image_bug
    
            anchors.fill: parent
            source: "images/Original_bug.png"
        }
    
        ShaderEffectSource {
            id: effectSource
    
            sourceItem: image_bug
            anchors.centerIn: image_bug
            width: 400
            height: 400
            sourceRect: Qt.rect(x,y, width, height)
        }
    
        FastBlur{
            id: blur
            anchors.fill: effectSource
    
            source: effectSource
            radius: 100
        }
    }
    

    如果您需要其他形状,我认为您可能需要应用蒙版着色器,先切出相关部分,然后再应用模糊。

    【讨论】:

    • 幸运的是,半年前我自己解决了这个问题,我的解决方案和你的几乎一样。所以,我不会发布答案并接受它,而只是接受你的。
    • 注意,在许多用例中需要设置 recursive: true。还要确保将 ShaderEffectSource 设置为可见:false。 FastBlur 是实际渲染的。 100 太高了,从 16-20 开始是一个更好的数字。
    【解决方案2】:

    不是最漂亮的解决方案,但恐怕没有这样的 Qml 机制。
    您可以将具有相同来源的第二张图片应用到您的图片上,然后根据您的需要进行剪辑,如下所示:

    Image {
        id: img
        anchors.fill: parent
        source: "bug.png"
    
        Item { id: info
            anchors.centerIn: parent
            height: 200
            width: 200
    
        Text {
            text: "HAMMER TIME"
            color: "white"
        }
    
        /* BLUR CODE HERE TO BLUR BACKGROUND OF THIS ITEM */
        /* which is a part of "bug.png" image with 200x200 size */
        /* and offset equals to "info.x" and "info.y" */
    
        clip:true
        Image {
            id: img2
            x: -info.x
            y: -info.y
            width: img.width
            height: img.height
            source: img.source
        }
        FastBlur {
            anchors.fill: img2
            source: img2
            radius: 32
        }
    }
    

    【讨论】:

    • 我相信您的代码可能有效,但我要求的是通用解决方案,因为该问题不仅影响图像,而且影响任何 qml 类型(可以分层并用作ShaderEffect 的源)。无论如何,谢谢你。此外,这里还有一个问题 - 在 qml2 中,如果您用作效果源的项目将有动画,您的代码将有问题。
    • 至于为source 设置动画时可能出现的问题,让我们在width 属性上说:为什么您会期望在info 中使用严格的size==200 将其大小调整为缩放图像?如果你真的想要这样的效果,只需对动画属性进行依赖绑定即可。
    • 至于更通用的解决方案,我相信可以通过应用自定义着色器并将图像的属性值(x、y、宽度、高度)传递给它来完成。也许我以后可以为你做一个例子。
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多