2014-11-04 62 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