有没有办法检查 PNG 图像中选择的 (x,y) 点是否透明?
有没有办法检查 PNG 图像中选择的 (x,y) 点是否透明?
var img = document.getElementById('my-image');
var canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
接下来,当用户点击时,使用event.offsetX
和event.offsetY
获取位置。然后可以用它来获取像素:
var pixelData = canvas.getContext('2d').getImageData(event.offsetX, event.offsetY, 1, 1).data;
如@pst所说,Canvas是实现这一目标的好方法。查看此答案以获取一个很好的例子:
下面是一些可以为您提供帮助的代码:
var imgd = context.getImageData(x, y, width, height);
var pix = imgd.data;
for (var i = 0, n = pix.length; i < n; i += 4) {
console.log pix[i+3]
}
这将逐行进行,因此您需要将其转换为x,y并将for循环转换为直接检查或运行条件语句。再次阅读您的问题,看起来您想能够获取人点击的点。这可以使用jQuery的click事件轻松完成。只需在点击处理程序中运行上述代码,如下所示:$('el').click(function(e){
console.log(e.clientX, e.clientY)
}
这些应该获取您的 x 和 y 值。
在Brian Nickel的回答基础上,只有所需的单个像素被绘制到1*1像素画布上,这比绘制整个图像以获取单个像素更有效:
function getPixel(img, x, y) {
let canvas = document.createElement('canvas');
canvas.width = 1;
canvas.height = 1;
canvas.getContext('2d').drawImage(img, x, y, 1, 1, 0, 0, 1, 1);;
let pixelData = canvas.getContext('2d').getImageData(0, 0, 1, 1).data;
return pixelData;
}
之前的两个答案演示了如何使用Canvas和ImageData。我想提供一个带有可运行示例并使用图像处理框架的答案,这样您就不需要手动处理像素数据。
MarvinJ提供了方法 image.getAlphaComponent(x,y),它简单地返回x,y坐标处像素的透明度值。如果该值为0,则像素完全透明,1到254之间的值是透明级别,最后255是不透明的。
为了演示,我使用了下面的图像(300x300)具有透明背景和位于坐标(0,0)和(150,150)处的两个像素。
控制台输出:
(0,0): 透明
(150,150): 不透明
image = new MarvinImage();
image.load("https://i.imgur.com/eLZVbQG.png", imageLoaded);
function imageLoaded(){
console.log("(0,0): "+(image.getAlphaComponent(0,0) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
console.log("(150,150): "+(image.getAlphaComponent(150,150) > 0 ? "NOT_TRANSPARENT" : "TRANSPARENT"));
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
With : i << 2
const pixels = context.getImageData(x, y, width, height).data;
for (let i = 0, dx = 0; dx < data.length; i++, dx = i << 2)
{
if (pixels[dx+3] <= 8) { console.log("transparent x= " + i); }
}
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");
const input = document
.querySelector('input[type="file"]');
input.addEventListener("change", e => {
const image = new Image();
image.addEventListener("load", e => {
const {width, height} = image;
canvas.width = width;
canvas.height = height;
ctx.drawImage(image, 0, 0);
const {data} = ctx.getImageData(
0, 0, width, height
);
const rgb = (x, y) => {
const i = (x + y * width) * 4;
return data.slice(i, i + 4).join(", ");
};
canvas.addEventListener("mousemove", event => {
const {offsetX: x, offsetY: y} = event;
console.log(rgb(x, y));
});
canvas.addEventListener("click", event => {
const {offsetX: x, offsetY: y} = event;
document.querySelector("div")
.textContent = rgb(x, y);
});
});
image.addEventListener("error", () =>
console.error("failed")
);
image.src = URL
.createObjectURL(event.target.files[0]);
});
.as-console-wrapper {
height: 21px !important;
}
<div>
Upload image and mouseover to preview RGB. Click to select a value.
</div>
<form>
<input type="file">
</form>
<canvas></canvas>
参考资料: