我目前正在做一个涉及图片的大项目。我遇到的大问题之一是图片的字节顺序(jpeg 更清楚)。我一直认为在我们的现代世界中我们不必担心这个问题,但现在我不确定。
我做什么:
- 我向 IP 摄像机发出 HTTP 请求,摄像机返回给我一个字节数组。
- 我使用以下方法将这些字节解析为 .NET 中的对象 Image
Image.FromStream
.
- 我将图像对象保存到硬盘上的物理文件中。
然后,这些图片在我的应用程序的另一个模块中使用,该模块使用第三方“查看器”对图像进行一些操作。该查看器适用于使用 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 还有一个附加字段:用户评论:。
这两张图片可以在任何照片查看器中正常打开,只有在第 3 方查看器中,图片显示完全混合,三张图片之间的唯一区别是这些字段。
我想知道的是:
- 第三方是否可能需要在其软件中添加额外的代码,以便需要处理图片的字节序?我猜所有的图片程序都会处理这个问题?
- 我是否可以将 jpeg 的字节序更改为始终为小字节序?我在某处读到 jpeg 文件的内容始终应该采用相同的字节顺序,但似乎没有考虑 exif 数据。如果可能的话,我会喜欢 .NET 中的解决方案......
- 任何有助于解决这种情况的问题也将被视为答案。
EDIT 1: 我找到了这个article确认 exif 标头中找到的字节顺序仅适用于 exif 标头,并且 jpeg 文件始终采用大字节序。那么有没有办法更改 exif 标头,以便第 3 方软件能够读取他需要的内容?
好吧,我通过向 Phil 提出问题找到了答案,Phil 是exiftool
你可以看到我和他的话题here.
- 是的,这是可能的。第 3 方 SDK 不知道 exif 标头可以使用小端或大端进行编码,并且仅使用小端进行读取。将我的所有图片更改为小端模式解决了问题。
- 答案分为两部分:首先,正如我的编辑中所述,jpeg 的数据始终是大端字节序。其次,exif 标头可以是小端字节序或大端字节序,并且可以使用 exiftool 对其进行更改。
在命令行中:
exiftool -all= -tagsfromfile test.jpg -all:all -unsafe -exifbyteorder=little-endian test.jpg
您还可以在此找到几乎任何语言的该工具的包装器page.
非常感谢您对这个问题和我收到的答案的兴趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)