2015-01-19 4 views
3

Возможно ли размытие элемента, находящегося за другим элементом?QML Shader Effect blur за объектом

Пример: размыть часть изображения (как в QML - parent.centerIn: изображение)

Blur example

Я хочу что-то вроде:

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, потому что официальный docs не имеют ответа на вопрос, и все мои попытки не увенчались успехом - можно только размыть WHOLE ITEM, но не является его частью.

ответ

3

Вот мое решение. Эта версия применима только к Rectangles. Элемент ShaderEffectSource помогает создать такой прямоугольник источника.

enter image description here

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 
    } 
} 

Если вам нужны другие формы, я думаю, что вам, возможно, придется применить маску-шейдер, вырезая соответствующие части первой, а затем применить размытие.

+0

К счастью, я смог решить эту проблему самостоятельно полгода назад, и мое решение почти такое же, как у вас. Поэтому я не буду публиковать ответ и принимать его, а просто принять ваше. –

0

Не самое красивое решение, но я боюсь, что такого механизма 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 
    } 
} 
+0

Я считаю, что ваш код может работать, но я просил универсального решения, потому что вопрос не затрагивает только изображения, но любой тип qml (который может быть многоуровневым и использоваться как источник для ShaderEffect). В любом случае, благодарю Вас. Кроме того, вот еще одна проблема - в qml2 ваш код будет ошибкой, если элемент, который вы используете как источник эффекта, будет иметь анимацию. –

+0

Что касается возможной проблемы при анимации 'source' let say on' width': почему вы ожидаете чего-то в элементе 'info' со строгим' size == 200', отрегулируете его размер до масштабированного изображения? Если вам действительно нужен такой эффект, просто создавайте привязки зависимостей от анимированных свойств. – pawel

+0

Что касается более универсального решения, я считаю, что это можно сделать, применяя пользовательский шейдер и передавая ему значения свойств (x, y, width, height) изображения. Возможно, я смогу сделать пример для вас позже. – pawel

 Смежные вопросы

  • Нет связанных вопросов^_^