2016-09-23 91 views
1

在一個字節數組中,比如[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/

非常感謝您的幫助,謝謝!

回答

4

要獲得最後兩位,請嘗試value & 3而不是value % 100。 (value % 100value的餘數除以100後得到十進制數,而不是二進制數)。然後,您需要將這兩位移入最終字節中的適當位置。是這樣的:

r = (pixels[n][0] & 3) << 4; 
    g = (pixels[n][1] & 3) << 2; 
    b = (pixels[n][2] & 3); 
    a = (pixels[n][3] & 3) << 6; 

    val = a | r | g | b; // assembled byte 

(我不是尋址這是否爲在組裝值或正確的像素陣列順序的位正確的順序)

+0

我假設這肯定比我有更接近正確的,但是我仍然因爲某種原因得到了亂碼輸出。我知道數據沒有以任何方式壓縮。我已經以多種方式改變了順序,並且令人驚訝的是,它看起來並沒有影響它們的順序,因爲輸出完全相同。如果有幫助,所有的價值現在都是0,1,2或3(這看起來不正確)。 –

+0

好吧,我做錯了什麼,但它仍然是不正確的。 'console.log(r,g,b,a)'現在看起來像這樣:'16 0 0 192',但是'str'仍然是亂碼。 –

+0

在這種情況下字符串應該如何? – pavnik

1

我是不是一個JS人,但我認爲代碼應該是這樣的:

... 
r = (pixels[n][0] & 3); 
g = (pixels[n][1] & 3); 
b = (pixels[n][2] & 3); 
a = (pixels[n][3] & 3); 
byte = (a << 6) | (r << 4) | (g << 2) | b; 
str += String.fromCharCode(byte); 
... 
相關問題