我想用C#写一个小程序,通过我的jpeg照片,例如,将它们分类到有日期的文件夹中(使用MY的约会约定,该死的...)。
有谁知道以编程方式获取日期和时间或曝光等EXIF数据的相对简单的方法?谢谢!
Answers:
签出此元数据提取器。它是用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);
Orientation
每个图像中都有一个标记,通常是一个魔术数字,但是该库告诉您旋转(即Rotate 180
或Rotate 90 CCW
)。
如建议的那样,您可以使用某些第三方库,也可以手动进行(这不是很多工作),但是最简单,最灵活的方法是使用.NET中的内置功能。有关更多信息,请参见:
我说“这是最灵活的”,因为.NET不会以任何方式尝试解释或合并数据。对于每个EXIF,您基本上都会获得一个字节数组。这可能是好是坏,取决于您实际需要多少控制权。
另外,我应该指出,属性列表实际上并不直接对应于EXIF值。EXIF本身存储在具有重叠ID的多个表中,但是.NET将所有内容放在一个列表中,并重新定义某些项目的ID。但是,只要您不关心精确的EXIF ID,就可以使用.NET映射。
编辑:可以在不遵循此答案的情况下加载完整图像的情况下执行此操作:https : //stackoverflow.com/a/552642/2097240
PropertyItems
不加载整个图像的情况下进行操作:stackoverflow.com/a/552642
这是另一个类似的SO问题的链接,该问题的答案指向.Net中有关“阅读,书写和照片元数据”的这篇好文章。
图像类具有PropertyItems和PropertyIdList属性。您可以使用它们。
Phil Harvey的命令行工具ExifTool处理多种图像格式-包括大量专有的RAW格式-并可以处理多种元数据格式,包括EXIF,GPS,IPTC,XMP,JFIF。
非常易于使用,轻巧,令人印象深刻的应用程序。
最近,我使用了.NET元数据API。我还写了一篇有关它的博客文章,其中显示了使用C#从图像中读取,更新和删除EXIF数据。
using (Metadata metadata = new Metadata("image.jpg"))
{
IExif root = metadata.GetRootPackage() as IExif;
if (root != null && root.ExifPackage != null)
{
Console.WriteLine(root.ExifPackage.DateTime);
}
}