java - TIFF 5.0 风格的 LZW 压缩有什么特别之处

标签 java decode tiff lzw

我正在编写 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 LZW 编码器时遇到了同样的问题。 TIFF 检查工具在正确解码图像时提示“旧式 LZW 代码”。经过一些研究,我发现 LZW 压缩机的实现发生了变化。原始(“旧式”)格式使用与 GIF LZW 压缩器完全相同的操作模式。实际上,您可以使用工作的 GIF 压缩器并将其插入 TIFF 实现中,而不需要太多努力,并且它会生成大多数 TIFF 读者可以接受的文件。 (我发现的一个值得注意的异常(exception)是 Corel PaintShop Pro X7。)

“old-style”和“new-style”的区别在于两个编码细节:

  • LZW 代码以相反的位顺序写入流。
  • “New-style”比“old-style”提前一个符号增加代码大小(所谓的“Early Change”)。

聪明的 TIFF 解码器检查比特流的前一个或两个字节以检测“旧式”编码。这是可能的,因为发出的第一个符号始终是明文代码 0x100。如果第一个字节是 0x00,那么显然是前导 1 位之后的 8 个零位,所以它是“旧式”。 “新式”比特流从1比特开始,所以第一个字节是0x01。

关于java - TIFF 5.0 风格的 LZW 压缩有什么特别之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366659/

相关文章:

.net - Tiff 注释

java - JPA - 使用复合 PK 和 FK 并定义关系

java - logback 功能 - 如何开发滚动事件的监听器?

java - 保存集合 : org. hibernate.LazyInitializationException : failed to lazily initialize a collection, 没有 session 或 session 已关闭

R 将字符串从 6 位二进制解码为 8 位二进制

video - 如何解码从 yuv444p 帧编码的 h264 视频?

docker - vrt文件(vsizip)中带有zip的相对路径?

java - 发送带有附件和消息的邮件

python - 将解码后的 jpeg 绘制到开罗表面

tiff - LibTiff.NET 追加模式错误?