JPEG的字节序对编码有什么影响?

10
我目前正在从事一个涉及图片的大型项目。其中一个主要问题是关于图片(更明确地说,是JPEG格式)的尾数。我一直以为在我们现代化的世界中不必再为此担心,但现在我不确定了。
我的操作步骤如下:
1. 我向IP摄像头发送HTTP请求,该摄像头返回给我一个字节数组。 2. 我使用.NET将这些字节解析成图像对象Image,使用方法为 Image.FromStream 。 3. 我将我的图像对象保存到硬盘上的物理文件中。
然后,我的应用程序的另一个模块会使用这些图片,并使用第三方“查看器”对图片进行一些操作。该查看器可以处理在Windows XP和Windows Vista计算机上生成的所有图片。但是当使用Windows 7机器生成图片时,图片就会出现问题。
假设使用Windows XP创建的图片将被称为PictureXP,而使用Windows 7创建的图片将被称为Picture7。我使用exiftools检查了这些文件,并发现PictureXP和Picture7之间有两个不同的字段。
PictureXP:Exif Byte Order:Little-endian
Picture7:Exif Byte Order:Big-endian
Picture7还有一个附加字段:User Comment:。
这三张图片都可以在任何照片查看器中正常打开,只有在这个第三方查看器中才会显示混乱,而这三张图片之间的唯一区别就是这些字段。
我想知道的是:
  1. 第三方是否需要在其软件中添加其他代码以处理图片的字节序?我猜所有的图片程序都会处理吧?
  2. 我能否改变我的JPEG文件的字节序为小端序?我在某个地方读到,JPEG文件的内容总是应该处于相同的字节序,但似乎这并不考虑Exif数据。如果可以的话,我希望能够用.NET解决。
  3. 任何有助于解决这种情况的东西也将被视为答案。

编辑1:我找到了这篇文章证实,在Exif头中发现的字节顺序仅适用于Exif头,而JPEG文件始终是大端序。那么有没有办法更改Exif头,使得第三方软件能够读取所需内容呢?


哇,这是一个好问题。摄像头的原始流已经是JPEG格式了,还是另一种格式需要转换成JPEG? - Brady Moritz
是的,http contentType 是 "image/jpeg"。 - Jean-François Côté
2个回答

8

好的,我向Phil提问后找到了答案,他是exiftool的作者。

你可以在这里看到我们之间的交流。

  1. 是的,这是可能的。第三方SDK不知道exif头可以使用小端或大端编码,只能使用小端读取。将所有图片更改为小端格式即可解决问题。
  2. 回答分两部分:首先,JPEG数据始终采用大端字节序,如我所述。其次,exif头可以采用小端或大端字节序,并且可以使用exiftool进行更改。

在命令行中:

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

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

非常感谢你对这个问题和我得到的答案的关注。


1

我认为问题可能出在用户评论字段上。我在某个地方读到,Windows Vista(可能还有Windows 7)将用户评论字段保存为Unicode格式,采用小端字节顺序,而不考虑EXIF信息的字节顺序。 由于PictureXP和Picture7之间唯一的区别是EXIF信息和用户评论字段的字节顺序,也许你应该从这个方向入手。

祝好运!


你对评论字段的看法是正确的。但经过一些验证,这个SDK(第三方)似乎并没有使用这个字段。很高兴你指出了这一点。谢谢! - Jean-François Côté

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