2010-08-20 134 views
10

我有一個base64編碼的PNG。我需要使用javascript來獲取像素的顏色。我想我必須將其轉換回正常的PNG。 任何人都可以指向正確的方向嗎?使用javascript獲取Base64 PNG的像素顏色?

+0

是的,你必須二者的base64解碼,然後解碼JavaScript中的PNG流。這是一個很難(雖然不是不可能)的問題。您可能實際上受限於此要求,但如果您提供更多的上下文,則可能會得到一些範圍更廣的答案,以提供此情況下的其他解決方法。例如。 PNG數據來自哪裏?它會去哪裏?你需要每個圖像的單個固定像素嗎?你有任何服務器支持?等等 – 2010-08-20 05:06:30

+0

爲了使它更加詳細:我正在嘗試編寫一個Safari擴展。它將模仿Colorzilla for Firefox的功能。我看到這是可能的唯一方法是,如果你採取「截圖」。輸出在Base64 PNG中。我最終需要跟蹤鼠標,然後將其與圖像同步以將點擊的像素數據從圖像中拉出。 – switz 2010-08-20 05:08:45

+0

@BenZotto爲什麼會很難? – Melab 2017-02-02 13:50:51

回答

14

使用base64圖像作爲源創建一個Image對象。然後,您可以將圖像繪製到畫布上,並使用getImageData函數獲取像素數據。

這裏是基本的想法(我沒有測試過這一點):

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

非常感謝!然後,我將其轉換爲十六進制代碼。有沒有辦法從getImageData中提取十六進制數據,還是必須將其轉換。無論哪種方式,謝謝! – switz 2010-08-20 16:18:37

+0

@Switz:不直接。你只需要用'toString(16)'或類似的東西分別轉換每個通道。 – 2010-08-20 17:55:20

+0

這就是我所做的。謝謝! – switz 2010-08-20 18:19:40