从TIFF文件中提取JPEG

6
背景 我有一个大的TIFF文件,其中使用了JPEG(TIFF标准中新的压缩7),且该文件是平铺式的。我的需求是将这些平铺提取到单独的.jpg文件中。我需要在不解压/重新压缩图像数据的情况下完成此操作,因为这将需要太多计算资源,所以我知道的所有库都不能使用。
我对TIFF文件结构非常了解,但对JPEG文件结构几乎一无所知。我现在编写的代码从tiff头中读取JPEGTable标记数据并将其读入字节数组(即它会到达标记指向的偏移量并在那里读取它),然后再读取目标平铺到一个字节数组中。然后,我将表格字节数组写入新文件,然后在其中写入平铺字节数组。我将表格数组的最后2个字节和平铺数组的前2个字节都覆盖为0xFF, 0xFF,因为我发现两个数组的开头和结尾分别以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

编辑:我在Adobe Photoshop TIFF Technical Notes from March 22, 2002手册中找到了一个部分,其中写道:

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

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


1
我想看到一个原始瓷砖和相应的JPG,请。这将帮助我们所有人可视化正在发生的事情。谢谢。 - Sam Axe
1
我已经编写了自己的TIFF和JPEG编解码器;我可能可以帮助您找出问题所在。请将原始TIFF文件与您提取的图块一起发送给我,我可能能够发现问题(bitbank at pobox dot com)。从您的示例图像来看,量化表似乎出了问题。 - BitBank
跟进...TIFF 文件使用的是 RGB 色彩空间,所以 JPEG 瓦片不能作为单独的 JFIF 文件进行编写,因为它们使用的颜色空间与普通的 YCrCb 不同。 - BitBank
2个回答

7
由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


我这周打算尝试一下!谢谢!JPEG文档提到可以存储RBG数据而不是转换,但是描述太模糊了! - keepitreall89
在我的情况下,由于我还需要编写哈夫曼表,因此我从Tiff中编写了哈夫曼表,减去了最后2个字节,即图像结束标记,然后编写了上面的16字节序列,然后是我的图像字节,从第2个字节开始。谢谢! - keepitreall89

0

我也有同样的问题。对我来说,BitBank 提供的字节数组是正确的。但是我没有将字节插入到 SOI 之前(这会导致错误),而是插入到 SOF 之前,这样它就可以工作了!基本上 keepitrall89 谈论的是第二个字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接