7

だからここに私はbase64でエンコードされたpng画像を持っています:

iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==

を使用してデコードしましたatob()。それは次のようになります:

PNG

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

この文字列から色の値を取得することは可能ですか?(使用せずに<canvas>

PS:デモを見つけたので、それは可能のようです:http:
 //labs.calyptus.eu/JSBin/Demo/Viewer.html
 しかし、彼がどのようにそれをしたのかはわかりません。

4

3 に答える 3

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);
        }
    }
}

この関数のループを見ると、PNGを1行ずつ読み取り、ピクセルをプロットしていることがわかります。

簡単な例は次のとおりです。

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 ;)
}
于 2012-08-05T01:10:50.903 に答える
1

いいえ、その文字列から直接色の値を取得することはできません。PNG画像データをなんらかの方法でデコードする必要があります(圧縮されています)。使用<canvas>することはそれを行う1つの方法です。

于 2012-08-05T01:01:02.890 に答える
1

キャンバスやブラウザのレンダリングサイクルに依存せずにこれを行うと便利な場合があります。たとえば、単体テストランナーのようなヘッドレス環境でこの作業を行う必要がある場合です。

これは、png.jsと呼ばれるライブラリの助けを借りて可能です

const PNGReader = require('png.js');

function parseDataImage(data: string) {
  console.log('Data is', data); // Data is data:image/png;base64,iVBORw0KGgoAAAANSUh...
  const base64 = data.split(',')[1];
  console.log('Base64 is', base64); // Base64 is iVBORw0KGgoAAAANSUh...
  const bytes = atob(base64); // Base64 Decode
  console.log('Bytes are', bytes); // Bytes are <Some binary data>
  const png = new PNGReader(bytes);
  png.parse((err, png) => {
    console.log('Pixels are', png.pixels); // Pixels are Buffer{0: 255, 1: 0, 2: 65, ...
  });
}
于 2020-12-01T22:44:47.780 に答える