我正在编写TIFF解码器。我正在使用的LZW解码器可与所有LZW压缩的GIF和TIFF图像配合使用,但其中一个会使解码代码字符串的缓冲区溢出。我使用com.sun.media.imageioimpl.plugins.tiff包中的TIFFLZWDecompressor对其进行了测试,并抛出以下异常“ java.lang.UnsupportedOperationException:不支持TIFF 5.0样式的LZW代码”。
我一直在尝试找到5.0样式LZW的特殊之处,但没有成功。有人对此有任何想法吗?
注意:从TIFFLZWDecompressor源代码开始,TIFF 5.0样式的LZW压缩的指示符是压缩数据的前两个字节{0x00,0x01}。
最佳答案
TIFF 6.0规范说:
也可以实现一个LZW版本,其中LZW字符
深度等于BitsPerSample,如修订版5.0的草案2中所述。但是有一个
这种方法的主要问题。如果BitsPerSample大于11,则不能
如果使用最大12位代码,则生成的LZW表太大了。
(TIFF6.pdf,第58-59页)
这可能就是他们所指的。
另一方面...在我自己的读者中,我发现:
注意:这是违反规范的行为。但是,libTiff会读取此类文件。
TIFF 6.0规范的第13节:“ LZW压缩” /“算法”,第61页说:
LZW压缩代码以从高到低的顺序存储在字节中,即FillOrder
假定为1。将压缩代码写为字节(不是字),以便
无论是“ II”文件还是“ MM”文件,压缩数据都是相同的。”
关于0x00、0x01的内容实际上是“反向”中的“清除代码”(即遵循字节顺序,而不是按照规范所说忽略它)。