我在一家工程设计公司工作,我们存储了用CCITT Group 4压缩压缩的TIFF格式的黑白设计图纸。
我正在开发一个项目来改进我们用于处理这些图纸的软件。我需要能够将原始数据加载到我的程序中,所以我必须将其解压缩。
我尝试使用LibTiff,但很快放弃了。它不会构建,产生超过2000个错误。我在库中发现了许多明显的语法错误,并认为它是垃圾。我花了大约3个小时试图找到实现CCITT Group 4编解码器的库的一部分,但没有运气,那段代码是一个难以理解的混乱。
所以我正在为程序编写自己的编解码器。我的工作效果很好,但我遇到了问题。我找不到这种格式的好文档。有很多好的概述通常描述了2D Modified Huffman压缩是如何工作的,但是我找不到任何具有特定的实现级细节的概述。所以我试图通过使用一些绘图文件作为示例来解决这个问题。
我的垂直和传递模式运行良好,我的算法在它离开向导并产生垃圾之前正确解压缩了大约三分之一的图像。
我将问题追溯到水平模式。我的水平模式算法希望看到水平模式代码001,后跟一组化妆代码(可选)和当前笔颜色的终止代码,然后是另一组化妆代码(可选)和终止代码相反的颜色。
这个算法在图像的三分之一处工作得很好,但突然间我遇到了水平模式运行,其中相反的颜色出现在当前的笔颜色之前。
图像的一部分是12个黑色像素,然后是22个白色像素 该部分的代码位是00100000110000111,它解码为水平(001)22白色(0000011)12黑色(0000111),如您所见,它与像素在图像中出现的顺序相反。
由于我的算法需要图像顺序列表,因此会崩溃。但是同一图像文件中之前的307个水平模式实例都是按图像顺序排列的。这是我发现的唯一逆转(到目前为止)。
其他成像程序显示此文件就好了。我尝试手动编辑图像文件中的位,就像测试一样,按顺序放置顺序,这会导致其他成像程序在解码图像时崩溃。这使我相信他们有某种方式知道在那种情况下它是相反的。
任何人都知道有关此TIFF CCITT G4编码的具体实现级别详细信息,这可以帮助我了解运行代码有时会如何以及为何被逆转?
由于 约什
答案 0 :(得分:1)
CCITT G4水平代码始终编码为一对(黑/白)或(白/黑)。这取决于当前的笔颜色。垂直代码将翻转颜色,但水平代码将保持颜色不变。如果当前笔颜色为黑色,则解码白色水平代码后跟黑色。如果当前的笔颜色为白色,那么您将采用相反的方式。
答案 1 :(得分:0)
代码:00100000110000111
001:水平模式
0000011000:黑色运行长度17
0111:白色RunLength 2
首先是黑色。
运行代码不可逆转。