2014-11-04 66 views
0

我正在研究壓縮算法。我正在讀取8位/像素的圖像文件,我想將這8位值壓縮成4位以便壓縮。我希望對位進行一些有用的瞭解用Java打包,我該如何解決這個問題?我不需要一個工作解決方案。只是指導。Java中的位封裝

在此先感謝

+1

你的實際壓縮算法是什麼? – harold 2014-11-04 08:53:31

+0

@harold我將使用量化。統一量化 – Shehlina 2014-11-04 08:54:44

+0

好吧,這是有道理的,那麼只是從這些4位的東西(帶成對,結合'(a << 4)| b')的字節,發送字節 – harold 2014-11-04 08:55:56

回答

0

Java有運算符來測試/操縱數字的位。看看這個:

Bitwise and Bit Shift Operators

如果你需要處理的比特金額較大,還有的Bitset類。

基本上你所需要的僅僅是按位運算符來測試/操縱byteint類型的變量位。

1

你的壓縮例程可以如下所示:

void compress(byte[] pic, byte[] picCompressed) { 
    boolean odd = false; 
    int pos = 0; 

    for (byte p : pic) 
    { 
     byte b = quantize(p); 

     if (odd) { 
      picCompressed[pos++] |= (byte)(b << 4); 
     } else { 
      picCompressed[pos] = b;    
     } 

     odd = !odd; 
    }  
} 

原始數組在循環中運行。通過交替變量odd控制,壓縮的4位填充到壓縮數組中的字節位置的上半部分或下半部分。

簡單化量化例程只是忽略低4位:

byte quantize(byte p) { 
    return (byte)((p >> 4) & 0x0F); 
} 

在實踐中,量化是不均勻的和經常使用的查找表來實現。您可以使用一個256字節的數組爲每個可能的字節值分配一個目標值。

+0

運行此代碼會將字節值{0,1,2,3,4,5}轉換爲{0,0,0,0,0}。它是否實現了壓縮? – Shehlina 2014-11-04 17:59:10

+0

@Shehlina:低於15的所有字節值都被量化爲0.因此,你得到的都是零字節。使用不同的量化值或更大的值來查看差異。 – 2014-11-04 19:44:11

+0

謝謝。我使用更大的數組值(240,241,242,242),仍然全部爲零。當你說「使用不同的量化」時,你是什麼意思?你能提供一個例子嗎? – Shehlina 2014-11-04 21:48:04