如何修复 JPG 文件中的 EXIF 方向数据
How to fix EXIF orientation data in JPG files
我有一个数码相框,里面展示了我过去 20 年来拍摄的所有最佳全家福照片。它始终适用于纵向和横向照片。
一年多前换了一部新手机(小米A1),拍照功能超赞,可惜拍出来的照片在相框上都旋转了90度。旧的人像照片仍然可以正常显示,我的新相机拍摄的人像照片在我的电脑上显示正常,Google 照片等。但是当我将它们加载到相框时,它们会旋转 90 度。
我在 SuperUser 上询问过,得到的 answer 方向信息在 EXIF 数据中,显然是其他所有图像 reader 都能理解的格式,但我的相框不't,我需要在图像编辑器中修改我所有的纵向图像,以便框架能够识别 EXIF 数据。
作为一名程序员,显然我不会手动执行此操作。但我不知道如何查看或编辑 JPG 的 EXIF 数据。
任何人都有方便的代码片段来更改 JPG 的方向? C# 首选。
正如您所说,Exif 中有方向数据。它定义了原始像素数据在显示之前应如何转换(旋转,但也可能在任一轴上翻转)。
对于带有 Exif 的 JPEG 图像,'easy' 旋转图像的方法只是更新 Exif 信息。当然,这需要查看者尊重该旋转信息。
更昂贵的方法(并且可能有损)是物理旋转图像数据。我怀疑这是为了满足你的相框需要做的。
例如,在 .NET 中,您可以使用 System.Windows.Drawing
执行此操作。 Image.RotateFlip
方法将是一个很好的起点。
要从您的图像中提取方向数据,我可以谦虚地建议使用我的 MetadataExtractor 库吗?
var orientation = ImageMetadataReader.ReadMetadata(myImagePath)
.OfType<ExifIfd0Directory>()
.FirstOrDefault()
?.GetObject(ExifIfd0Directory.TagOrientation);
这会给你一个 int?
,其值为:
- 顶部,左侧(水平/正常)
- 顶部,右侧(镜像水平)
- 底部,右侧(旋转 180)","底部,左侧(镜像垂直)
- 左侧,顶部(镜像水平并顺时针旋转 270)
- 右侧,顶部(顺时针旋转 90 度)
- 右侧,底部(镜像水平并顺时针旋转 90 度)
- 左侧,底部(顺时针旋转 270)
顺便说一句,主要是因为它很有趣:JPEG 图像被编码为 16x16 像素的网格 'blocks'。如果您的图像在两个方向上都不是 16 像素的倍数,则旋转可能会改变此网格的对齐方式,这将导致图像解码和重新编码,从而丢失信息。如果原始 JPEG 的压缩率较低,那么您可能无法察觉到这种损失,因此指出它可能是学术性的,但它仍然会存在。
我有一个数码相框,里面展示了我过去 20 年来拍摄的所有最佳全家福照片。它始终适用于纵向和横向照片。
一年多前换了一部新手机(小米A1),拍照功能超赞,可惜拍出来的照片在相框上都旋转了90度。旧的人像照片仍然可以正常显示,我的新相机拍摄的人像照片在我的电脑上显示正常,Google 照片等。但是当我将它们加载到相框时,它们会旋转 90 度。
我在 SuperUser 上询问过,得到的 answer 方向信息在 EXIF 数据中,显然是其他所有图像 reader 都能理解的格式,但我的相框不't,我需要在图像编辑器中修改我所有的纵向图像,以便框架能够识别 EXIF 数据。
作为一名程序员,显然我不会手动执行此操作。但我不知道如何查看或编辑 JPG 的 EXIF 数据。
任何人都有方便的代码片段来更改 JPG 的方向? C# 首选。
正如您所说,Exif 中有方向数据。它定义了原始像素数据在显示之前应如何转换(旋转,但也可能在任一轴上翻转)。
对于带有 Exif 的 JPEG 图像,'easy' 旋转图像的方法只是更新 Exif 信息。当然,这需要查看者尊重该旋转信息。
更昂贵的方法(并且可能有损)是物理旋转图像数据。我怀疑这是为了满足你的相框需要做的。
例如,在 .NET 中,您可以使用 System.Windows.Drawing
执行此操作。 Image.RotateFlip
方法将是一个很好的起点。
要从您的图像中提取方向数据,我可以谦虚地建议使用我的 MetadataExtractor 库吗?
var orientation = ImageMetadataReader.ReadMetadata(myImagePath)
.OfType<ExifIfd0Directory>()
.FirstOrDefault()
?.GetObject(ExifIfd0Directory.TagOrientation);
这会给你一个 int?
,其值为:
- 顶部,左侧(水平/正常)
- 顶部,右侧(镜像水平)
- 底部,右侧(旋转 180)","底部,左侧(镜像垂直)
- 左侧,顶部(镜像水平并顺时针旋转 270)
- 右侧,顶部(顺时针旋转 90 度)
- 右侧,底部(镜像水平并顺时针旋转 90 度)
- 左侧,底部(顺时针旋转 270)
顺便说一句,主要是因为它很有趣:JPEG 图像被编码为 16x16 像素的网格 'blocks'。如果您的图像在两个方向上都不是 16 像素的倍数,则旋转可能会改变此网格的对齐方式,这将导致图像解码和重新编码,从而丢失信息。如果原始 JPEG 的压缩率较低,那么您可能无法察觉到这种损失,因此指出它可能是学术性的,但它仍然会存在。