JPEG字节序在编码时如何重要?

我目前正在开展一个涉及图片的大项目。 我遇到的一个重大问题是图片的字节顺序(jpeg更清晰)。 我总是认为,在我们的现代世界中,我们不必讨论这个问题,但现在我不确定。

我所做的:

  1. 我向IP摄像机发出HTTP请求,摄像机返回一个字节数组。
  2. 我使用Image.FromStream将这些字节解析为.NET中的对象Image。
  3. 我使用我的Image对象并执行保存到硬盘上的物理文件。

这些图片然后在我的应用程序的另一个模块中使用,该模块使用第三方“查看器”对图像进行一些操作。 查看器使用Windows XP和Windows Vista中使用计算机生成的所有图片。 但是当使用Windows 7机器生成图片时,图片全部搞砸了。

假设使用Windows XP创建的图片将被称为PictureXP,使用Windows 7创建的图片将被称为Picture7。我使用exiftools检查文件,发现PictureXP和Picture7之间有2个不同的字段。

PictureXP:Exif字节顺序:Little-endian图7:Exif字节顺序:Big-endian Picture7还有一个附加字段:User Comment :.

这两张照片可以在任何照片浏览器中正常打开,只有在这个第三方观看者中,图片才会显示出混合,3张图片之间的唯一区别就是这些字段。

我想知道的是什么:

  1. 是否有可能第三方需要将附加代码添加到他的软件中,以便它需要处理图片的字节顺序? 我想那里的所有图片程序都处理那个?
  2. 我是否有可能将我的jpeg的endianness改为little-endian? 我在某处读过jpeg文件的内容总是应该是相同的字节序,但似乎它没有考虑exif数据。 如果有可能,我会喜欢.NET中的解决方案……
  3. 任何有助于解决这种情况的事情也将被视为一种答案。

非常感谢!

编辑1 :我发现这篇文章确认在exif头中找到的endiannes只适用于exif头,并且jpeg文件总是在big-endian中。 那么有没有办法改变exif标题,以便第三方软件能够读取他需要的东西?

好的,所以我通过向exiftool的作者Phil提问来找到答案

你可以在这里看到我和他在一起的post。

  1. 是的,这是可能的。 第三方SDK不知道exif标头可以使用little-endian或big-endian进行编码,只能使用little-endian进行读取。 将我的所有图片更改为little-endian修复了问题。
  2. 2部分答案:首先,jpeg的数据总是如我编辑中所说的大端。 其次,exif标题可以是little-endian或big-endian,也可以使用exiftool进行更改。

在命令行中:

exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg

您还可以在此页面中找到几乎所有语言的工具包装器。

非常感谢您对我收到的问题和答案的兴趣。

我想问题可能在于用户评论字段。 我在某处读到Windows Vista(可能还有Windows 7)以小端字节顺序将用户注释字段保存为Unicode,而不管EXIF信息的字节顺序如何。 由于PictureXP和Picture7之间唯一的区别是exif信息和用户注释字段的字节顺序,也许你应该这样看

祝好运