当用户单击图像时,如何使用 JavaScript 或 jQuery 读取图像像素的颜色?(当然,我们通过订阅点击事件获得了这个像素的 (x,y) 值)。
当用户单击图像时,如何使用 JavaScript 或 jQuery 读取图像的像素?
IT技术
javascript
jquery
2021-01-29 14:39:28
2个回答
如果您可以在画布元素中绘制图像,那么您可以使用该getImageData
方法返回一个包含 RGBA 值的数组。
var img = new Image();
img.src = 'image.jpg';
var context = document.getElementById('canvas').getContext('2d');
context.drawImage(img, 0, 0);
data = context.getImageData(x, y, 1, 1).data;
如果您需要重复读取像素,此解决方案会快得多。
魔术®
function getPixel(imgData, index) {
var i = index*4, d = imgData.data
return [d[i],d[i+1],d[i+2],d[i+3]] // [R,G,B,A]
}
function getPixelXY(imgData, x, y) {
return getPixel(imgData, y*imgData.width+x)
}
你从哪里得到 imgData?
- 创建
<canvas>
- 得到画布
context
- 复制
<img>
到<canvas>
- 获取画布图像数据(一组值
[r,g,b,a,r,g,b,a,r,g,..]
) - 做`魔术`®
乐码:
var cvs = document.createElement('canvas'),
img = document.getElementsByTagName("img")[0] // your image goes here
// img = $('#yourImage')[0] // can use jquery for selection
cvs.width = img.width; cvs.height = img.height
var ctx = cvs.getContext("2d")
ctx.drawImage(img,0,0,cvs.width,cvs.height)
var idt = ctx.getImageData(0,0,cvs.width,cvs.height)
// The magic®
getPixel(idt, 852) // returns array [red, green, blue, alpha]
getPixelXY(idt,1,1) // same pixel using x,y
有关工作示例,请参阅http://qry.me/xyscope/ 的源代码
PS:如果您打算对数据进行变异并将它们绘制回画布上,则可以使用subarray
var
a = getPixel(idt, 188411), // Array(4) [0, 251, 0, 255]
b = idt.data.subarray(188411*4, 188411*4 + 4) // Uint8ClampedArray(4) [0, 251, 0, 255]
a[0] = 255 // does nothing
getPixel(idt, 188411) // Array(4) [0, 251, 0, 255]
b[0] = 255 // mutates the original imgData.data
getPixel(idt, 188411) // Array(4) [255, 251, 0, 255]
// or use it in the function
function getPixel(imgData, index) {
var i = index*4, d = imgData.data
return imgData.data.subarray(i, i+4) // returns subarray [R,G,B,A]
}
您可以在http://qry.me/xyscope/上对此进行试验,此代码在源代码中,只需将其复制/粘贴到控制台中即可。