2010-08-20 16 views
10

Ich habe eine Base64-codierte PNG. Ich brauche die Farbe eines Pixels mit Javascript. Ich gehe davon aus, dass ich es wieder in ein normales PNG konvertieren muss. Kann mir jemand in die richtige Richtung zeigen?Get Pixelfarbe von Base64 PNG mit Javascript?

+0

Ja, Sie werden sowohl base64-decode haben, und dann die PNG-Stream in Javascript dekodieren. Dies ist ein hartes (wenn auch nicht unmöglich) Problem. Sie könnte in der Tat auf diese Anforderung eingeschränkt werden, aber wenn Sie ein wenig mehr Kontext geben, könnten Sie einige breitere-scoped Antworten geben andere Abhilfen in der Lage zu bekommen. Z.B. Woher kommen die PNG-Daten? Wohin geht es? Benötigen Sie für jedes Bild einen einzelnen festen Pixel? Haben Sie Server-Unterstützung? –

+0

usw. Um es etwas ausführlicher: Ich bin versucht, eine Safari-Erweiterung zu schreiben. Es wird die Fähigkeiten von Colorzilla für Firefox nachahmen. Der einzige Weg, wie ich das gesehen habe, ist, wenn du einen "Screenshot" machst. Die Ausgabe erfolgt in Base64 PNG. Ich müsste schließlich die Maus verfolgen und dann mit dem Bild synchronisieren, um die Daten des angeklickten Pixels aus dem Bild zu ziehen. – switz

+0

@Benzotto Warum wäre es schwer? – Melab

Antwort

14

Ein Image Objekt mit dem base64 Bild als Quelle. Dann können Sie das Bild auf eine Arbeitsfläche zeichnen und die getImageData-Funktion verwenden, um die Pixeldaten abzurufen.

Hier ist die Grundidee (ich dies nicht getestet):

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

Vielen Dank! Ich nahm das dann und konvertierte zu Hex-Codes. Gibt es eine Möglichkeit, Hex-Daten von getImageData zu holen, oder muss ich es konvertieren? Wie auch immer, danke! – switz

+0

@Switz: Nicht direkt. Sie müssen jeden Kanal einzeln mit 'toString (16)' oder etwas ähnlichem konvertieren. –

+0

Das habe ich gemacht. Vielen Dank! – switz