如何在 Qt/QML 中使图像的透明部分不可选择
How to make transparent part of image unselectable in Qt/QML
我已将 PNG 图像加载到我的 QML 代码中并启用了拖动功能。
Image {
source: "image.png"
width: 128
height: 128
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
问题是整个图像都是可选的,甚至是我需要在这些区域上禁用选择的透明部分。我什至尝试从图像中制作 Canvas
,但问题仍然存在。
Canvas {
width: 128
height: 128
Component.onCompleted: loadImage("image.png")
onImageLoaded: requestPaint()
onPaint: {
var ctx = getContext("2d")
var im = ctx.createImageData("image.png")
im.data[3] = 128
ctx.drawImage(im, 0, 0)
}
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
这是唯一应该可选择的红色部分的图像:
有什么想法吗?
您可以通过this method获取图像数据:
CanvasImageData getImageData(real sx, real sy, real sw, real sh)
然后可以查看点击位置的像素颜色值,决定是否选区。
您可以找到有关如何访问单个像素的更多信息here。它适用于 HTML canvas,但 QML canvas 应该完全兼容。
...
MouseArea {
anchors.fill: parent
drag.target: parent
onClicked: {
var ctx = parent.getContext("2d")
// get the pixel
var imageData = ctx.getImageData(mouseX, mouseY, 1, 1)
// read the color data and decide whether to select or not
}
}
我已将 PNG 图像加载到我的 QML 代码中并启用了拖动功能。
Image {
source: "image.png"
width: 128
height: 128
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
问题是整个图像都是可选的,甚至是我需要在这些区域上禁用选择的透明部分。我什至尝试从图像中制作 Canvas
,但问题仍然存在。
Canvas {
width: 128
height: 128
Component.onCompleted: loadImage("image.png")
onImageLoaded: requestPaint()
onPaint: {
var ctx = getContext("2d")
var im = ctx.createImageData("image.png")
im.data[3] = 128
ctx.drawImage(im, 0, 0)
}
MouseArea {
anchors.fill: parent
drag.target: parent
}
}
这是唯一应该可选择的红色部分的图像:
有什么想法吗?
您可以通过this method获取图像数据:
CanvasImageData getImageData(real sx, real sy, real sw, real sh)
然后可以查看点击位置的像素颜色值,决定是否选区。
您可以找到有关如何访问单个像素的更多信息here。它适用于 HTML canvas,但 QML canvas 应该完全兼容。
...
MouseArea {
anchors.fill: parent
drag.target: parent
onClicked: {
var ctx = parent.getContext("2d")
// get the pixel
var imageData = ctx.getImageData(mouseX, mouseY, 1, 1)
// read the color data and decide whether to select or not
}
}