从TIFF文件中提取JPEG

kee*_*l89 6 .net jpeg tiff

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

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

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()
Run Code Online (Sandbox Code Playgroud)

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

如果有人希望我发布我正在使用的一些代码,我可以,只需要知道哪个部分. 提取 原版的

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

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

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

Bit*_*ank 6

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元数据文档