我搜索了如何着色图像(格式为svg或png ...)。
我尝试使用填充图像的矩形覆盖我的图像,但由于我的图像不是矩形,因此它会对整个矩形进行着色,而不仅仅是图像。
是否可以使用qml更改图像颜色?或者,是否可以使用QPixmap更改qt(使用C ++)上的颜色,然后将QPixmap集成到QML项目上?
感谢您的帮助。 (如果没有解决方案,我将不得不将不同的图像加载到具有不同颜色的相同基本图像。)
答案 0 :(得分:18)
您可以使用Qt 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
}
}
答案 1 :(得分:4)
您可以使用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);
}
"
}
上面的代码将您的图像转换为灰度图像,然后应用您的颜色。
答案 2 :(得分:2)
您也可以使用Colorize
与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
}
}