在一個字節數組中,比如[40, 0, 156, 243]
,我需要從數組的每個字節的最後兩位中取出1個字節。這用於解碼和編碼PICO-8盒式磁帶(see here),它將程序數據存儲在PNG圖像中。這裏是我一直在考慮對數據如何存儲的信息:如何得到一個字節的最後2位
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