从TIFF文件中提取JPEG

时间:2012-01-05 18:39:53

标签: .net jpeg tiff

背景 我有一个大的TIFF文件,用JPEG压缩(新的,TIFF标准的压缩7)并平铺。我需要做的是将这些图块提取到单个.jpg文件。我需要能够解压缩/重新压缩图像数据,因为这需要太多的计算资源,因此我所知道的所有库都是不可能的。

我对TIFF文件结构了解很多,但几乎没有关于JPEG文件结构的知识。我现在编写的代码将来自tiff头的JPEGTable标签数据读入一个字节数组(意味着它转到标签指向的偏移量并在那里读取)和另一个将目标Tile读入一个字节的代码模糊阵列。然后我将 Table 字节数组写入一个新文件,然后将 Tile 字节数组写入该文件。 Table 数组的最后2个字节我用0xFF,0xFF写入,并且 Tile 数组的前2个字节相同,因为我发现两个数组都启动了分别以jpeg SOI和EOI序列结束,如果我有超过1个,则任何图像程序都无法打开这些文件。

For i as Integer = 0 to TableArray.Count-3
    stream.WriteByte(TableArray(i))
Next
stream.WriteByte(255)
stream.WriteByte(255)
stream.WriteByte(255)
stream.WriteByte(255)
For i as Integer = 2 to TileArray.Count-1
    stream.WriteByte(TileArray(i))
Next
stream.Close()

问题 所以这就是我现在所处的问题,问题是我提取的瓷砖都是粉红色的,它应该是白色的,几乎就像一个彩色底片。它不是坚实的粉红色,我可以看到我知道在原始图像中的物体的轮廓。有没有人有任何想法我怎么能解决这个问题?另外,我在VB.NET中这样做,但我不认为这种语言在这种情况下真的很重要,因为它似乎更像是一个概念/算法/文件结构问题我做错了。

如果有人希望我发布我正在使用的一些代码,我可以,只需要知道哪个部分。 Extracted Original

编辑:我在2002年3月22日的Adobe Photoshop TIFF技术说明中找到了一个部分说:

  

从TIFF到交换JPEG的转换更复杂。如果所有条带使用相同的JPEG表并且没有RSTn标记,则可以非常轻松地转换基于条带的TIFF / JPEG文件:只需删除开销标记并在条带之间插入RSTn标记。转换平铺图像更难,因为数据通常不是正确的顺序(除非图块只有一个MCU高)。这仍然可以无损地完成,但将需要撤消和重做熵编码,以便可以更新DC系数差异。

不确定这是否与我的问题有关。

1 个答案:

答案 0 :(得分:4)

Photoshop生成的TIFF文件的难点在于它们支持将RGB色彩空间写入JPEG压缩数据。如果从TIFF文件中提取单个图块并将其作为独立的JPEG图像写入,则无法正确显示,因为解码器会假定颜色空间为YCbCr。只要查看应用程序遵循Adobe APP14标记,就有一个解决方案。此标记中包含一个定义变换(颜色空间)的字节。如果在SOI之前插入此字节序列,则图像将在许多查看器上正确显示。

FF EE 00 0E 41 64 6F 62 65 00 64 80 00 00 00 00

最后一个字节定义了变换;在这种情况下,0表示RGB色彩空间。你可以在这里阅读更多相关信息:

Oracle JPEG metadata doc