我正在研究压缩算法。我正在读取8位/像素的图像文件,我想将这8位值压缩成4位以便压缩。我希望对位进行一些有用的了解用Java打包,我该如何解决这个问题?我不需要一个工作解决方案。只是指导。Java中的位封装
在此先感谢
我正在研究压缩算法。我正在读取8位/像素的图像文件,我想将这8位值压缩成4位以便压缩。我希望对位进行一些有用的了解用Java打包,我该如何解决这个问题?我不需要一个工作解决方案。只是指导。Java中的位封装
在此先感谢
Java有运算符来测试/操纵数字的位。看看这个:
Bitwise and Bit Shift Operators
如果你需要处理的比特金额较大,还有的Bitset
类。
基本上你所需要的仅仅是按位运算符来测试/操纵byte
或int
类型的变量位。
你的压缩例程可以如下所示:
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字节的数组为每个可能的字节值分配一个目标值。
你的实际压缩算法是什么? – harold 2014-11-04 08:53:31
@harold我将使用量化。统一量化 – Shehlina 2014-11-04 08:54:44
好吧,这是有道理的,那么只是从这些4位的东西(带成对,结合'(a << 4)| b')的字节,发送字节 – harold 2014-11-04 08:55:56