我正在研究一种压缩算法。我正在读取一个8位/像素的图像文件,我想将这8位值打包成4位以便压缩。我希望对Java中的位填充有一些有用的了解。我该如何处理这个问题?我不需要有效的解决方案。只需指导。
提前致谢
答案 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
类。
基本上你需要的只是按位运算符来测试/操作byte
或int
类型的变量位。