Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 从TIFF文件中提取JPEG_.net_Jpeg_Tiff - Fatal编程技术网

.net 从TIFF文件中提取JPEG

.net 从TIFF文件中提取JPEG,.net,jpeg,tiff,.net,Jpeg,Tiff,背景 我有一个大的TIFF文件,它是用JPEG压缩的(新的,TIFF标准中的压缩7),并且是平铺的。我需要做的是将这些平铺提取到单个.jpg文件中。我需要能够在不解压缩/重新压缩图像数据的情况下做到这一点,因为这将需要太多的计算资源,所以我所知道的所有库都是不可能的 我对TIFF文件结构了解很多,但对JPEG文件结构几乎一无所知。我现在已经编写了代码,将JPEGTable标记数据从tiff头读取到字节数组中(这意味着它到达标记指向的偏移量并在那里读取),以及另一段代码,将目标平铺读取到字节数组中

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

我对TIFF文件结构了解很多,但对JPEG文件结构几乎一无所知。我现在已经编写了代码,将JPEGTable标记数据从tiff头读取到字节数组中(这意味着它到达标记指向的偏移量并在那里读取),以及另一段代码,将目标平铺读取到字节数组中。然后我将表字节数组写入一个新文件,然后将平铺字节数组写入该文件。我用0xFF、0xFF写入的表数组的最后2个字节与平铺数组的前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中这样做的,但我认为在这种情况下语言并不重要,因为它似乎更像是一个概念/算法/文件结构问题,我做错了

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

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

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


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

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

最后一个字节定义转换;在这种情况下,0表示RGB颜色空间。您可以在此处阅读更多信息:


我希望看到一个原始瓷砖和一个生成的JPG。这将有助于我们大家看清正在发生的事情。谢谢。@Boo谢谢,我没想到。DoneI已经编写了自己的TIFF和JPEG编解码器;我也许能帮你解决这个问题。请将原始TIFF文件连同您提取的磁贴一起发送给我,我可能会发现问题(位于pobox.com的bitbank)。从您的示例图像来看,量化表似乎乱七八糟。接下来…TIFF文件使用RGB颜色空间,因此JPEG平铺不能作为单独的JFIF文件写入,因为它们使用与正常YCrCb不同的颜色空间进行编码。我将在本周尝试!非常感谢。JPEG文档提到可以存储RBG数据而不是转换,但它太模糊了!在我的例子中,因为我还有一个哈夫曼表要写,所以我从Tiff中写了哈夫曼表,减去图像标记末尾的最后2个字节,然后我写上面的16字节序列,然后我的图像字节,从字节2开始。谢谢