になど[40, 0, 156, 243]
を最後の2ビットを取得するにはどのように、私は、配列の各バイトの最後の2ビットから1つのバイトをする必要があります。これは、プログラムデータをPNGイメージに格納するPICO-8カートリッジ(see here)をデコードしてエンコードするためのものです。ここで私は、データが格納されている方法に与えられてきたという情報がある:、バイトの配列でバイト
For png files, the lower 2 bits of each pixel component makes up one byte, so 1 byte per pixel. The last 32 bytes are metadata for the PNG (since 160*205 = 0x8020, 32 extra bytes) byte = (a << 6) | (r << 4) | (g << 2) | b;
は、ここで私がこれまで持っているものだが、出力はすべてのちんぷんかんぷんです:
var imgWidth = 160;
var imgHeight = 205;
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var img = document.createElement('img');
img.src = 'Invasion.png';
canvas.width = imgWidth;
canvas.height = imgHeight;
img.onload = function() {
var imgData = [];
var str = '';
var i = 0, n = 0, dataLen = 0;
ctx.drawImage(img, 0, 0);
imgData = ctx.getImageData(0, 0, imgWidth, imgHeight).data;
dataLen = imgData.length;
for(i; i < dataLen; i+=4) {
var r = imgData[i];
var g = imgData[i + 1];
var b = imgData[i + 2];
var a = imgData[i + 3];
r = (r & 3) << 4;
g = (g & 3) << 2;
b = (b & 3);
a = (a & 3) << 6;
byte = a | r | g | b; // assembled byte
str += String.fromCharCode(byte);
}
console.log(str);
};
フィドル:https://jsfiddle.net/24o3fzg3/
が大幅に、感謝をこの上の任意の助けに感謝します!
私はこれが確かに私が持っていたものより正確に近いと思っていますが、私はまだ何らかの理由で不器用な出力を得ています。データが圧縮されていないことはわかっています。私は複数の方法で注文を変更しましたが、驚くべきことに、出力がまったく同じであるため、注文の順序を変えていないようです。それが助けになると、すべての値が0,1,2,3と出てきています(これは正しいとは思われません)。 –
私は間違ったことをしていましたが、それでも正しいことではありません。 'console.log(r、g、b、a)'は '16 0 0 192'のようになりますが、' str'はまだ不器用です。 –
この場合、文字列はどのようにする必要がありますか? – pavnik