我想在C#中编写一个小程序,通过我的jpeg照片,例如,将它们分类为过时的文件夹(使用我的约会惯例,该死...).
有没有人知道以编程方式获取日期和时间或曝光等EXIF数据的相对简单的方法?谢谢!
正如所建议的,您可以使用某些第三方库,或者手动执行(这不是那么多工作),但最简单和最灵活的可能是使用.NET中的内置功能.欲了解更多信息:
System.Drawing.Image.PropertyItems属性
System.Drawing.Imaging.PropertyItem类
如何:读取图像元数据
我说"它是最灵活的",因为.NET不会试图以任何方式解释或合并数据.对于每个EXIF,您基本上都得到一个字节数组.根据您实际需要的控制程度,这可能是好的也可能是坏的.
另外,我应该指出,属性列表实际上并不直接对应于EXIF值.EXIF本身存储在具有重叠ID的多个表中,但.NET将所有内容放在一个列表中并重新定义某些项的ID.但只要您不关心精确的EXIF ID,您就可以使用.NET映射了.
查看此元数据提取器.它是用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().FirstOrDefault(); var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime);
它可以通过NuGet和GitHub上的代码获得.
这是一个链接到另一个类似的SO问题,它的答案指向.Net中关于"阅读,写作和照片元数据"的好文章.
您可以使用由F-Spot等应用程序使用的TagLib#.除了Exif之外,它还会读取大量的图像,音频和视频元数据格式.
我也喜欢ExifUtils API,但它有缺陷并且没有积极开发.
Image类具有PropertyItems和PropertyIdList属性.你可以使用它们.