是否可以从base64图像读取像素数据?

Der*_*會功夫 6 javascript base64

所以这里我有一个base64编码的png图像:

iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
Run Code Online (Sandbox Code Playgroud)

然后我使用对其进行了解码atob()。原来是:

PNG

IHDRo&åIDAT×cøÿÿ?Ã Ã Ð1ñXÍõ5ËÑIEND®B`

是否可以从该字符串中获取颜色值?(不使用<canvas>

PS:现在看来似乎是可能的,因为我发现了一个演示:
http://labs.calyptus.eu/JSBin/Demo/Viewer.html
?但我不确定他是如何做到的。

Ric*_*uza 4

在您指向的页面的源代码中,有一个函数使用 PNG.js 和其他一些实用程序来执行您想要的操作:

function show(data){
    var png = new PNG(data);
    var img = document.getElementById('image'), limg = document.getElementById('largeimage');
    document.getElementById('nativeimage').src = 'data:image/png;base64,' + data;
    img.innerHTML = '';
    limg.innerHTML = '';
    img.style.width = png.width + 'px';
    img.style.height = png.height + 'px';
    limg.style.width = (png.width * 3) + 'px';
    limg.style.width = (png.height * 3) + 'px';
    var line;
    while(line = png.readLine())
    {
        for (var x = 0; x < line.length; x++){
            var px = document.createElement('div'), px2 = document.createElement('div');
            px.className = px2.className = 'pixel';
            px.style.backgroundColor = px2.style.backgroundColor = '#' + line[x].toString(16).padRight('0', 6);
            img.appendChild(px);
            limg.appendChild(px2);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您查看此函数中的循环,您会注意到它正在逐行读取 PNG 并绘制像素。

一个简化的例子是:

var png = new PNG(data); // data is the base64 encoded data
var line;
var y = 0;
while(line = png.readLine())
{
    for (var x = 0; x < line.length; x++){
        var pixel = doSomethingWithPixelData(x, y, '#' + line[x].toString(16).padRight('0', 6));
    }
    y++;
}

function doSomethingWithPixelData(x, y, color) {
    // guess what? do something with pixel data here ;)
}
Run Code Online (Sandbox Code Playgroud)