题
我想用 C# 编写一个小程序,它可以浏览我的 jpeg 照片,例如,将它们分类到带日期的文件夹中(使用我的约会约定,该死......)。
有谁知道以编程方式获取 EXIF 数据(例如日期和时间或曝光)的相对简单的方法?谢谢!
解决方案
看看这个 元数据提取器. 它是用 Java 编写的,但也已移植到 C#。 我使用 Java 版本编写了一个小实用程序来根据日期和型号标签重命名我的 jpeg 文件。非常容易使用。
编辑 元数据提取器 也支持.NET。它是一个非常快速且简单的库,用于访问图像和视频中的元数据。
它完全支持 Exif,以及 IPTC、XMP 和许多其他类型的元数据,包括 JPEG、PNG、GIF、PNG、ICO、WebP、PSD...
var directories = ImageMetadataReader.ReadMetadata(imagePath);
// print out all metadata
foreach (var directory in directories)
foreach (var tag in directory.Tags)
Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}");
// access the date time
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime);
它可以通过 努格特 和 代码在 GitHub 上.
其他提示
正如建议的那样,您可以使用一些第三方库,或者手动完成(这不是很多工作),但最简单和最灵活的可能是使用 .NET 中的内置功能。更多请参见:
我说“它是最灵活的”,因为 .NET 不会尝试以任何方式解释或合并数据。对于每个 EXIF,您基本上都会得到一个字节数组。这可能是好是坏,具体取决于您实际想要的控制程度。
另外,我应该指出,属性列表实际上并不直接对应于 EXIF 值。EXIF 本身存储在具有重叠 ID 的多个表中,但 .NET 将所有内容放在一个列表中,并重新定义了某些项目的 ID。但只要您不关心精确的 EXIF ID,您就应该可以使用 .NET 映射。
这是另一个的链接 类似的问题, ,其中有一个答案指向这篇好文章 “阅读、写作和照片元数据” 在.Net中。
Image 类具有 PropertyItems 和 PropertyIdList 属性。你可以使用它们。
从 JPEG 图像获取 EXIF 数据涉及:
- 寻找提及 EXIF 数据开头的 JPEG 标记。例如通常oxFFE1是编码EXIF数据时插入的标记,它是一个APPlication段,EXIF数据所在的位置。
- 解析从 0xFFE1 到 0xFFE2 的所有数据。该数据将是 JPEG 编码文件中的字节流。
- 这些字节的 ASCII 等效项将包含与图像日期、相机型号名称、曝光等相关的各种信息...
命令行工具 ExifTool 由菲尔·哈维 (Phil Harvey) 设计 适用于数十种图像格式 - 包括大量专有的 RAW 格式 - 并且可以操作各种元数据格式,包括 EXIF、GPS、IPTC、XMP、JFIF。
非常易于使用,轻量级,令人印象深刻的应用程序。