如何使用C#从文件获取EXIF数据
时间:2020-03-05 18:52:07 来源:igfitidea点击:
我想用C编写一个小程序,该程序会检查我的jpeg照片,例如,将它们分类到带日期的文件夹中(使用我的约会约定,该死的...)。
有谁知道以编程方式获取日期和时间或者曝光等EXIF数据的相对简单的方法?
谢谢!
解决方案
回答
从JPEG图像获取EXIF数据涉及:
- 寻求提及EXIF数据开头的JPEG标记。例如通常,oxFFE1是在对EXIF数据进行编码时插入的标记,EXIF数据是EXIF数据所在的APPlication段。
- 解析从0xFFE1到0xFFE2的所有数据。该数据将是JPEG编码文件中的字节流。
- 这些字节的ASCII等效字符将包含与图像日期,相机型号名称,曝光等有关的各种信息。
回答
图像类具有PropertyItems和PropertyIdList属性。我们可以使用它们。
回答
签出此元数据提取器。它是用Java编写的,但也已移植到C#。我使用Java版本编写了一个小实用程序,用于根据日期和模型标签重命名jpeg文件。很好用。
EDIT元数据提取器也支持.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);
可通过NuGet和GitHub上的代码获得。
回答
这是另一个类似的SO问题的链接,该问题的答案指向.Net中有关"阅读,书写和照片元数据"的这篇好文章。
回答
如建议的那样,我们可以使用某些第三方库,也可以手动进行(这不是很多工作),但是最简单,最灵活的方法是使用.NET中的内置功能。有关更多信息,请参见:
- System.Drawing.Image.PropertyItems属性
- System.Drawing.Imaging.PropertyItem类
- 如何:读取图像元数据
我之所以说"它是最灵活的",是因为.NET不会以任何方式尝试解释或者合并数据。对于每个EXIF,我们基本上都会获得一个字节数组。这可能是好事,也可能是坏事,具体取决于我们实际需要多少控制权。
另外,我应该指出,属性列表实际上并不直接对应于EXIF值。 EXIF本身存储在具有重叠ID的多个表中,但是.NET将所有内容都放在一个列表中,并重新定义了某些项目的ID。但是,只要我们不关心精确的EXIF ID,就可以使用.NET映射。