2010-08-20 18 views
10

Tengo un PNG codificado en base64. Necesito obtener el color de un pixel usando javascript. Supongo que tendré que convertirlo a un PNG normal. ¿Alguien puede señalarme en la dirección correcta?Obtener el color de píxeles de Base64 PNG utilizando javascript?

+0

Sí, usted tendrá que tanto base64-decodificación, y luego descodificar la secuencia PNG en Javascript. Este es un problema difícil (aunque no imposible). Es posible que en realidad esté limitado a este requisito, pero si le da un poco más de contexto, es posible que obtenga respuestas con un alcance más amplio que brinden otras soluciones en la situación. P.ej. ¿De dónde vienen los datos PNG? ¿A dónde va? ¿Necesitas un único píxel fijo de cada imagen? ¿Tienes algún soporte de servidor? Etc. –

+0

Para hacerlo un poco más detallado: estoy intentando escribir una extensión de Safari. Imitará las capacidades de Colorzilla para Firefox. La única forma en que he visto que esto es posible es si toma una "captura de pantalla". La salida está en Base64 PNG. Eventualmente necesitaría rastrear el mouse, luego sincronizarlo con la imagen para sacar los datos del píxel cliqueado de la imagen. – switz

+0

@BenZotto ¿Por qué sería difícil? – Melab

Respuesta

14

Crea un objeto Image con la imagen base64 como fuente. Luego puede dibujar la imagen en un lienzo y usar la función getImageData para obtener los datos de los píxeles.

Aquí es la idea básica (no he probado esto):

var image = new Image(); 
image.onload = function() { 
    var canvas = document.createElement('canvas'); 
    canvas.width = image.width; 
    canvas.height = image.height; 

    var context = canvas.getContext('2d'); 
    context.drawImage(image, 0, 0); 

    var imageData = context.getImageData(0, 0, canvas.width, canvas.height); 

    // Now you can access pixel data from imageData.data. 
    // It's a one-dimensional array of RGBA values. 
    // Here's an example of how to get a pixel's color at (x,y) 
    var index = (y*imageData.width + x) * 4; 
    var red = imageData.data[index]; 
    var green = imageData.data[index + 1]; 
    var blue = imageData.data[index + 2]; 
    var alpha = imageData.data[index + 3]; 
}; 
image.src = base64EncodedImage; 
+0

¡Muchas gracias! Luego tomé eso y convertí a códigos hexadecimales. ¿Hay alguna forma de extraer datos hexadecimales de getImageData, o debo convertirlos? De cualquier manera, gracias! – switz

+0

@Switz: No directamente. Solo tiene que convertir cada canal individualmente con 'toString (16)' o algo similar. –

+0

Eso es lo que hice. ¡Gracias! – switz

Cuestiones relacionadas