Как стать автором
Обновить

Комментарии 7

Item {
    clip: true 
    radius: height/2

    Image {
        anchor.centerIn: parent
        height: parent.height
        fillMode: Image.PreserveAspectFit
        source: "photo.jpg"

    }
}
Здесь `clip: true` излишний. И в случае `fillMode: Image.PreserveAspectFit` нужно подстраивать размеры `rectangleMask` с помощью `imageOriginal.paintedWidth` и `imageOriginal.paintedHeight`. Я упомянул, что не рассматриваю в статье этот случай масштабирования изображения.
А ещё clip работает только по прямоугольным границам Item и вызывает перерисовку через дополнительный фрейм-буфер. Короче, не взлетит. Что предполагал автор комментария — останется тайной.
Для большой области (весь экран приложения) не очень быстро работало по моему опыту. С QSG, к сожалению, не сравнивал.
я когда-то делал как-то так:

RoundImage.qml:

import QtQuick 2.0

Item {

    property alias border: borderRectangle.border
    property alias source: image.source
    property alias fillMode: image.fillMode

    Image {
        id: image
        anchors.fill: parent
        anchors.margins: borderRectangle.border.width
    }

    Rectangle {
        id: mask
        anchors.fill: image
        radius: width / 2
    }

    TransparencyMask {
        anchors.fill: image
        source: image
        maskSource: mask
    }

    Rectangle {
        id: borderRectangle
        anchors.fill: parent

        radius: width / 2
        color: "transparent"
    }
}



TransparencyMask.qml:

import QtQuick 2.0

Item {
    property alias source: sourceImage.sourceItem
    property alias maskSource: sourceMask.sourceItem

    anchors.fill: parent
    ShaderEffectSource {
        id: sourceMask
        smooth: true
        hideSource: true
    }
    ShaderEffectSource {
        id: sourceImage
        hideSource: true
    }

    ShaderEffect {
        id: maskEffect
        anchors.fill: parent

        property variant source: sourceImage
        property variant mask: sourceMask

        fragmentShader: {
"
            varying highp vec2 qt_TexCoord0;
            uniform lowp sampler2D source;
            uniform lowp sampler2D mask;
            void main() {

                highp vec4 maskColor = texture2D(mask, vec2(qt_TexCoord0.x, qt_TexCoord0.y));
                highp vec4 sourceColor = texture2D(source, vec2(qt_TexCoord0.x, qt_TexCoord0.y));

                if(maskColor.a > 0.0)
                    gl_FragColor = sourceColor;
                else
                    gl_FragColor = maskColor;
            }
"
        }
    }
}

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации