25

我搜索了如何为图像着色(格式为 svg 或 png ...)。

我尝试用填充图像的矩形覆盖我的图像,但由于我的图像不是矩形,它会为整个矩形着色,而不仅仅是图像。

是否可以使用 qml 更改图像颜色?或者,是否可以使用 QPixmap 更改 qt(使用 C++)上的颜色,然后将 QPixmap 集成到 QML 项目上?

谢谢您的帮助。(如果没有解决方案,我将不得不将不同的图像加载到具有不同颜色的相同基本图像。)

4

3 回答 3

31

Qt 5(来自 5.2)中,您可以使用ColorOverlay如下:

import QtQuick 2.0
import QtGraphicalEffects 1.0

Item {
    width: 300
    height: 300

    Image {
        id: bug
        source: "images/butterfly.png"
        sourceSize: Qt.size(parent.width, parent.height)
        smooth: true
        visible: false
    }

    ColorOverlay {
        anchors.fill: bug
        source: bug
        color: "#ff0000"  // make image like it lays under red glass 
    }
 }

Qt 6中,模块QtGraphicalEffects(包括ColorOverlay)由于许可问题而被删除。

Qt 6.1中,GraphicalEffects 现在再次可用,@SCP3008 在下面评论

于 2014-03-31T12:40:36.670 回答
7

您也可以使用着色

和ColorOverlay不同的是:Colorize真的可以用HSL改变图像的颜色,更适合我。ColorOverlay 类似于将彩色玻璃放在具有 RGBA 的灰度图像上时发生的情况。

import QtQuick 2.12
import QtGraphicalEffects 1.12

Item {
    width: 300
    height: 300

    Image {
        id: bug
        source: "images/bug.jpg"
        sourceSize: Qt.size(parent.width, parent.height)
        smooth: true
        visible: false
    }

    Colorize {
        anchors.fill: bug
        source: bug
        hue: 0.0
        saturation: 0.5
        lightness: -0.2
    }
}
于 2019-02-26T15:45:52.633 回答
7

您可以使用ShaderEffect替换图像颜色。

ShaderEffect {
    property variant src: yourImage

    property real r: yourColor.r * yourColor.a
    property real g: yourColor.g * yourColor.a
    property real b: yourColor.b * yourColor.a

    width: yourImage.width
    height: yourImage.height

    vertexShader: "
        uniform highp mat4 qt_Matrix;
        attribute highp vec4 qt_Vertex;
        attribute highp vec2 qt_MultiTexCoord0;
        varying highp vec2 coord;

        void main() {
            coord = qt_MultiTexCoord0;
            gl_Position = qt_Matrix * qt_Vertex;
        }
    "

    fragmentShader: "
        varying highp vec2 coord;
        uniform sampler2D src;

        uniform lowp float r;
        uniform lowp float g;
        uniform lowp float b;

        void main() {
            lowp vec4 clr = texture2D(src, coord);
            lowp float avg = (clr.r + clr.g + clr.b) / 3.;
            gl_FragColor = vec4(r * avg, g * avg, b * avg, clr.a);
        }
    "
}

上面的代码将您的图像转换为灰度图像,然后应用您的颜色。

于 2016-03-04T15:47:38.523 回答