2010-08-20 33 views
10

Tôi có PNG được mã hóa base64. Tôi cần để có được màu sắc của một điểm ảnh bằng cách sử dụng javascript. Tôi cho rằng tôi sẽ phải chuyển nó trở lại PNG bình thường. Có ai có thể chỉ cho tôi đúng hướng không?Nhận màu pixel của Base64 PNG bằng javascript?

+0

Vâng, bạn sẽ có cho cả hai base64-decode, và sau đó giải mã các dòng PNG trong Javascript. Đây là một vấn đề khó (mặc dù không thể). Bạn có thể thực sự bị ràng buộc với yêu cầu này, nhưng nếu bạn cung cấp thêm một chút ngữ cảnh, bạn có thể nhận được một số câu trả lời rộng hơn phạm vi cung cấp cách giải quyết khác trong tình huống. Ví dụ. dữ liệu PNG đến từ đâu? Nó sẽ đi đâu? Bạn có cần một pixel cố định từ mỗi hình ảnh không? Bạn có hỗ trợ máy chủ nào không? Vv số –

+0

Để làm cho nó chi tiết hơn một chút: Tôi đang cố gắng viết một Tiện ích mở rộng Safari. Nó sẽ bắt chước các khả năng của Colorzilla cho Firefox. Cách duy nhất tôi đã thấy rằng điều này là có thể, là nếu bạn có một "ảnh chụp màn hình". Đầu ra nằm trong Base64 PNG. Cuối cùng tôi sẽ cần phải theo dõi con chuột, sau đó đồng bộ hóa với hình ảnh để kéo dữ liệu của pixel được nhấp ra khỏi hình ảnh. – switz

+0

@BenZotto Tại sao nó khó? – Melab

Trả lời

14

Tạo đối tượng Image với hình ảnh base64 làm nguồn. Sau đó, bạn có thể vẽ hình ảnh vào khung và sử dụng hàm getImageData để lấy dữ liệu pixel.

Dưới đây là ý tưởng cơ bản (Tôi đã không kiểm tra này):

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

Cảm ơn bạn rất nhiều! Sau đó tôi lấy nó và chuyển thành mã hex. Có cách nào để kéo dữ liệu hex từ getImageData, hay tôi phải chuyển đổi nó. Dù bằng cách nào, cảm ơn! – switz

+0

@Switz: Không trực tiếp. Bạn chỉ cần chuyển đổi từng kênh riêng lẻ với 'toString (16)' hoặc một cái gì đó tương tự. –

+0

Đó là những gì tôi đã làm. Cảm ơn! – switz

Các vấn đề liên quan