c# - 使用 MetadataExtractor GetDescription 获取方向时出现问题

标签 c# .net-6.0 metadata-extractor

目标

我想“纠正”图像的方向。我的计划是从与图像一起存储的 Exif 数据中提取方向,并使用它来通知图像的重新方向。

问题

这可能是我的问题,但对于这个特定的 Exif 属性,GetDescription(或 GetString)只是返回 null;我尝试过的所有其他属性(x15)都会返回一个值。在下面的示例代码(控制台应用程序)中,“方法 1”使用首选且高效的 GetDescription 方法来获取图像方向,而“方法 2”使用低效的 foreach > 循环遍历目录和标签来搜索方向。

using MetadataExtractor;
using MetadataExtractor.Formats.Exif;

string Filename = @"D:\Users\Simon\OneDrive\My Stuff\My Source\TestFuelPriceTracker\Originals\IMG_8490.jpg";

IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(Filename);

// Approach 1
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var Orientation1 = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagOrientation);
Console.WriteLine($"Approach 1: Orientation = \"{Orientation1}\"");

// Approach 2
foreach (var directory in directories)
{
    foreach (var tag in directory.Tags)
    {
        switch (tag.Name)
        {
            case "Orientation":
                Console.WriteLine($"Approach 2: Orientation = \"{tag.Description}\"");
                break;
        }
    }
}

// Approach 3
var Orientation2 = directories
    .OfType<ExifSubIfdDirectory>()
    .FirstOrDefault(s => string.Equals(s?.GetDescription(ExifDirectoryBase.TagOrientation), "Orientation", StringComparison.OrdinalIgnoreCase));
Console.WriteLine($"Approach 3: Orientation = \"{Orientation2}\"");

运行时,我得到以下结果...

Approach 1: Orientation = ""
Approach 2: Orientation = "Top, left side (Horizontal / normal)"
Approach 3: Orientation = ""

方法 2 表明方向信息实际上存在于图像中。请注意,我尝试了很多图像,但遇到了同样的问题。不确定这是否相关,但所有图像都是在 iPhone 12 上拍摄的。

根据 @aybe 的建议添加了方法 3。

环境

我在 Windows 11 Professional 计算机上使用 Visual Studio 2022,所有软件都已修补到最新版本。该框架是.NET 6。MetadataExtractor 版本 2.7.2。

最佳答案

建议的最终解决方案是...

IEnumerable<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(Filename);
var ifd0Directory = directories.OfType<ExifIfd0Directory>().FirstOrDefault();
int Orientation = -1;
if (ifd0Directory != null) {
    Orientation = ifd0Directory.TryGetInt32(ExifDirectoryBase.TagOrientation, out int value) ? value : -1;
}

如果成功,则返回 1 到 8(含)之间的整数值,如果出现问题,则返回 -1。对于任何感兴趣的人,这些数字的含义将在下面的文章中详细讨论......

JPEG Image Orientation and Exif

我还想向您指出以下 MIT 论文,该论文捕获了每个 Exif 标签的数据类型;还有很多其他好信息......

Description of Exif file format

关于c# - 使用 MetadataExtractor GetDescription 获取方向时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71628565/

相关文章:

c# - 如何使用 C# 解析值中包含 "&"的查询字符串?

C# 如何在不使用大量内存的情况下递归循环大量文件夹和文件

c# - 如何使用 C# 从 azure 应用程序洞察中获取记录?

c# - Blazor InputSelect OnChange 触发 UI 更新

c# - 通过触发器更改列表框的数据模板时,WPF ViewModel 数据绑定(bind)不起作用

c# - 为什么属性访问器中的访问修饰符应该比属性本身更具限制性?

azure - azure函数隔离6.0中的超时属性

java元数据提取器标签描述

java - ImageMetadataReader.readMetadata(file) 缺少数据

java - 使用元数据提取器时用于检索宽度和高度的简单 API