【问题标题】:How to fix EXIF orientation data in JPG files如何修复 JPG 文件中的 EXIF 方向数据
【发布时间】:2019-09-10 22:14:37
【问题描述】:

我有一个数码相框,展示了过去 20 年来我所有最好的家庭照片。它始终适用于纵向和横向照片。

现在我一年多前得到了一部新手机(小米米 A1),具有出色的拍照功能,但不幸的是,该相机拍摄的所有照片都显示在相框上旋转 90 度。旧的人像照片仍然可以正常显示,而新相机的人像照片在我的计算机、Google 相册等上也可以正常显示。但是当我将它们加载到相框时,它们会旋转 90 度。

我在 SuperUser 上询问,并得到一个 answer,说方向信息在 EXIF 数据中,这显然是其他图像阅读器都能理解的格式,但我的相框没有,我需要修改图像编辑器中的所有纵向图像,以便框架识别 EXIF 数据。

作为一名程序员,显然我不会手动执行此操作。但我不知道如何查看或编辑 JPG 的 EXIF 数据。

任何人有任何代码 sn-ps 方便更改 JPG 的方向?首选 C#。

【问题讨论】:

  • 谷歌搜索C# JPG alter EXIF data 显示了一些选项。您能否更新您的问题以列出您已经尝试过的那些(如果有的话)(以节省时间)?
  • exif 数据在文件头中。您可以使用十六进制编辑器查看它,例如 hexdump、xxd 或 bless(不是详尽的列表)。还有一个名为 exiftool 的漂亮实用程序,可以解析扩展的 exif 数据。如果您愿意的话,从技术上讲,您可以手动或使用脚本进行编辑。无论如何,一些数字取证分析可能是一个有趣的实验,可以了解照片的格式有何不同。

标签: c# image exif


【解决方案1】:

如您所说,Exif 中有方向数据。它定义了原始像素数据在显示之前应如何转换(旋转,但也可能在任一轴上翻转)。

对于带有 Exif 的 JPEG 图像,旋转图像的“简单”方法就是更新 Exif 信息。当然,这需要查看者尊重该旋转信息。

更昂贵(并且可能有损失)的方法是物理旋转图像数据。我怀疑这是你需要做的才能满足你的相框。

例如,在 .NET 中,您可以使用 System.Windows.Drawing 执行此操作。 Image.RotateFlip 方法是一个很好的起点。

要从您的图像中提取方向数据,我可以谦虚地建议使用我的MetadataExtractor 库吗?

var orientation = ImageMetadataReader.ReadMetadata(myImagePath)
    .OfType<ExifIfd0Directory>()
    .FirstOrDefault()
    ?.GetObject(ExifIfd0Directory.TagOrientation);

这会给你一个int?,它的值是:

  1. 顶部,左侧(水平/正常)
  2. 顶部,右侧(水平镜像)
  3. 底部,右侧(旋转 180 度)”,“底部,左侧(镜面垂直)
  4. 左侧,顶部(镜像水平并旋转 270 CW)
  5. 右侧,顶部(顺时针旋转 90)
  6. 右侧,底部(镜像水平并顺时针旋转 90)
  7. 左侧,底部(顺时针旋转 270)

这里有一个例外,主要是因为它很有趣:JPEG 图像被编码为 16x16 像素“块”的网格。如果您的图像在两个方向上都不是 16 像素的倍数,那么旋转可能会改变该网格的对齐方式,这将导致图像的解码和重新编码,从而丢失信息。如果原始 JPEG 的压缩率较低,那么您可能无法感知到这种损失,因此指出它可能是学术性的,但它仍然存在。

【讨论】:

  • 您的图书馆使用System.Drawing 吗?因为在创建高分辨率图像的位图后读取 Exif 数据是一个昂贵的过程......我正在尝试通过使用 WIC stackoverflow.com/questions/58061904/… 来解决这个问题
  • @techno,不,您将提供底层文件的路径或流。如果您的内存中已经有 Exif 数据,那么也有一些方法可以解析它。
猜你喜欢
  • 1970-01-01
  • 2012-05-16
  • 2019-01-07
  • 2021-12-15
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2021-03-13
  • 2012-12-25
相关资源
最近更新 更多