Respuestas:
Hay una sección sobre manipulación de píxeles en la documentación del W3C.
Aquí tienes un ejemplo de cómo invertir una imagen :
var context = document.getElementById('myCanvas').getContext('2d');
// Get the CanvasPixelArray from the given coordinates and dimensions.
var imgd = context.getImageData(x, y, width, height);
var pix = imgd.data;
// Loop over each pixel and invert the color.
for (var i = 0, n = pix.length; i < n; i += 4) {
pix[i ] = 255 - pix[i ]; // red
pix[i+1] = 255 - pix[i+1]; // green
pix[i+2] = 255 - pix[i+2]; // blue
// i+3 is alpha (the fourth element)
}
// Draw the ImageData at the given (x,y) coordinates.
context.putImageData(imgd, x, y);
¿Has probado el método getImageData?
var data = context.getImageData(x, y, 1, 1).data;
var rgb = [ data[0], data[1], data[2] ];
idx = (y * width + x) * 4
la respuesta de Georg. Sin embargo, no olvide actualizar ese objeto en caché cada vez que cambie la imagen.
Color()
constructor? Eso no parece existir en ningún lado
Sí, claro, siempre que tenga su contexto. ¿Cómo obtener el contexto del lienzo?
var imgData = context.getImageData(0,0,canvas.width,canvas.height);
// { data: [r,g,b,a,r,g,b,a,r,g,..], ... }
function getPixel(imgData, index) {
var i = index*4, d = imgData.data;
return [d[i],d[i+1],d[i+2],d[i+3]] // returns array [R,G,B,A]
}
// AND/OR
function getPixelXY(imgData, x, y) {
return getPixel(imgData, y*imgData.width+x);
}
PD: si planea mutar los datos y dibujarlos en el lienzo, puede usarsubarray
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(index, index+4) // returns subarray [R,G,B,A]
}
Puede experimentar con esto en http://qry.me/xyscope/ , el código para esto está en la fuente, simplemente cópielo / péguelo en la consola.
context.getImageData(x, y, 1, 1);
function GetPixel(context, x, y)
{
var p = context.getImageData(x, y, 1, 1).data;
var hex = "#" + ("000000" + rgbToHex(p[0], p[1], p[2])).slice(-6);
return hex;
}
function rgbToHex(r, g, b) {
if (r > 255 || g > 255 || b > 255)
throw "Invalid color component";
return ((r << 16) | (g << 8) | b).toString(16);
}
Sí, echa un vistazo a getImageData (). Aquí hay un ejemplo de cómo romper captcha con JavaScript usando canvas:
// Get pixel data
var imageData = context.getImageData(x, y, width, height);
//color at (x,y) position
var color = [];
color['red'] = imageData.data[((y*(imageData.width*4)) + (x*4)) + 0];
color['green'] = imageData.data[((y*(imageData.width*4)) + (x*4)) + 1];
color['blue'] = imageData.data[((y*(imageData.width*4)) + (x*4)) + 2];
color['alpha'] = imageData.data[((y*(imageData.width*4)) + (x*4)) + 3];
Práctico delineador de píxeles de lectura largo (dibuje el píxel aquí )
let rp=((s='.myCanvas',c=document.querySelector(s),ctx=c.getContext('2d')) => (x,y)=>Object.values(ctx.getImageData(x, y, 1, 1).data))();
rp(10,20) // rp(x,y) returns: [r,g,b,a] with values 0-255
La primera línea es la parte inicial donde puede cambiar el selector de lienzo s='.myCanvas'
. Este práctico delineador es bueno para probar algoritmos o hacer pruebas de concepto, pero para el código de producción es mejor usar otro código más claro y legible.
Si desea extraer un color particular de píxel pasando las coordenadas del píxel a la función, esto será útil
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function detectColor(x,y){
data=ctx.getImageData(x,y,1,1).data;
col={
r:data[0],
g:data[1],
b:data[2]
};
return col;
}
x
, y
es la coordenada cuyo color desea filtrar.
var color=detectColor(x,y)
El color es el objeto, se obtiene el valor RGB de color.r
, color.g
, color.b
.