LZW TIFF解码

时间:2014-07-22 14:40:03

标签: scala tiff lzw

使用LZW解压缩解码tiff文件时,编码比特流中的前9位应为“256”,即清晰码。

但是当我读到它时,我得到一个128,这是我无法弄清楚的。我用GDAL创建了这个文件。

我读取文件的代码是:

val res = (for {
  i <- 0 until next
  if (bitSet.get(i + index))
  } yield (1 << i)).sum

索引是编码比特流中的索引,接下来是我应该读取的位数(从9开始)。

所以我的问题是为什么我读128而不是256?当打印比特流输入时,设置为1的第一个比特是比特数8(索引7)。

有问题的文件是:https://dl.dropboxusercontent.com/u/42266515/aspect_lzw.tif

谢谢!

1 个答案:

答案 0 :(得分:4)

感谢您发布示例图片。图像没有错;第一个代码是0x100(256)。你必须记住,TIFF LZW编码在&#34; Motorola&#34;字节顺序。该文件的前两个字节是0x80 0x00。在二进制中,它是10000000 00000000.前9位(以正确的顺序查看)是100000000,即256.您必须以big-endian顺序收集字节,然后您才能解码它正确。这是一个示例字节流:

If the data from the file is: 0x80 0x01 0x25 0x43 0x7E

The bits are (laid out in big-endian order)
10000000 00000001 00100101 01000011 01111110

Taking 9-bit codes from this bitstream will get you:
100000000 (256), 000000100 (4), 100101010 (298), ...