背景
我有一个大的TIFF文件,其中使用了JPEG(TIFF标准中新的压缩7),且该文件是平铺式的。我的需求是将这些平铺提取到单独的.jpg文件中。我需要在不解压/重新压缩图像数据的情况下完成此操作,因为这将需要太多计算资源,所以我知道的所有库都不能使用。
我对TIFF文件结构非常了解,但对JPEG文件结构几乎一无所知。我现在编写的代码从tiff头中读取JPEGTable标记数据并将其读入字节数组(即它会到达标记指向的偏移量并在那里读取它),然后再读取目标平铺到一个字节数组中。然后,我将表格字节数组写入新文件,然后在其中写入平铺字节数组。我将表格数组的最后2个字节和平铺数组的前2个字节都覆盖为0xFF, 0xFF,因为我发现两个数组的开头和结尾分别以jpeg SOI和EOI序列开头和结束,如果我有超过1个,则任何图像程序都无法打开这些文件。
我对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进行操作,但我认为语言在这种情况下并不重要,因为这似乎更多是概念/算法/文件结构问题。
如果有人想让我发布一些我正在使用的代码,我可以,只需要知道哪一部分。
编辑:我在Adobe Photoshop TIFF Technical Notes from March 22, 2002手册中找到了一个部分,其中写道:
TIFF格式转换为交换JPEG格式较为复杂。如果所有条带使用相同的JPEG表而且没有RSTn标记,则基于条带的TIFF/JPEG文件可以相当容易地进行转换:只需删除开销标记并在条带之间插入RSTn标记即可。转换平铺图像更加困难,因为数据通常不会按正确的顺序排列(除非平铺只有一个MCU高)。这仍然可以无损地完成,但需要撤消和重做熵编码,以便可以更新DC系数差异。
不确定这是否与我的问题相关。