Java中的位打包

时间:2014-11-04 08:50:36

标签: java compression bit

我正在研究一种压缩算法。我正在读取一个8位/像素的图像文件,我想将这8位值打包成4位以便压缩。我希望对Java中的位填充有一些有用的了解。我该如何处理这个问题?我不需要有效的解决方案。只需指导。

提前致谢

2 个答案:

答案 0 :(得分: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字节的数组为每个可能的字节值分配目标值。

答案 1 :(得分:0)

Java有运算符来测试/操作数字的位。看看这个:

Bitwise and Bit Shift Operators

如果您需要处理更多的位,还有Bitset类。

基本上你需要的只是按位运算符来测试/操作byteint类型的变量位。