如何使用C#从文件中获取EXIF数据
我想用C#编写一个小程序,通过我的jpeg照片,例如,它们分类成date文件夹(使用我的约会约会,该死的…)。
有没有人知道一个相对简单的方法获取EXIF数据,如date和时间或曝光编程方式? 谢谢!
正如所build议的那样,您可以使用一些第三方库,或手动执行(这不是那么多工作),但最简单和最灵活的方法是使用.NET中的内置function。 更多请参阅:
-
System.Drawing.Image.PropertyItems属性
-
System.Drawing.Imaging.PropertyItem类
-
如何:读取图像元数据
我说“这是最灵活的”,因为.NET不会以任何方式解释或合并数据。 对于每个EXIF,你基本上得到一个字节数组。 这可能是好的或坏的取决于你实际需要多less控制。
另外,我要指出的是,物业清单实际上并不直接对应EXIF值。 EXIF本身存储在多个ID重叠的表中,但.NET把所有东西放在一个列表中,并重新定义了一些项目的ID。 但只要你不关心精确的EXIF ID,你应该在.NET映射中可以。
这里是另一个相似的SO问题的链接,这个问题有一个答案指向这个在.Net中的“阅读,写作和照片元数据”的好文章。
看看这个元数据提取器 。 它是用Java编写的,但也被移植到C#中。 我已经使用Java版本来编写一个小工具来根据date和模型标签重命名我的jpeg文件。 非常容易使用。
编辑 元数据提取器也支持.NET。 这是一个非常快速和简单的图书馆访问来自图像和video的元数据。
它完全支持Exif,以及IPTC,XMP和许多其他types的元数据,包括JPEG,PNG,GIF,PNG,ICO,WebP,PSD等文件types。
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上的代码获得 。
您可以使用由F-Spot等应用程序使用的TagLib# 。 除Exif之外,它还将读取大量用于图像,audio和video的元数据格式。
我也喜欢ExifUtils API,但是它很麻烦,而且没有得到积极的开发。
Image类具有PropertyItems和PropertyIdList属性。 你可以使用它们。
Phil Harvey的命令行工具ExifTool可以处理数十种图像格式 – 包括大量专有的RAW格式 – 并且可以处理各种元数据格式,包括EXIF,GPS,IPTC,XMP,JFIF。
非常容易使用,轻巧,令人印象深刻的应用。
从JPEG图像获取EXIF数据涉及:
- 寻找提到EXIF数据开始的JPEG标记。 例如,通常oxFFE1是在对EXIF数据进行编码时插入的标记,EXIF数据是EXIF数据所在的应用程序段。
- parsing从0xFFE1到0xFFE2的所有数据。 该数据将是JPEG编码文件中的字节stream。
- 这些字节的ASCII等价物将包含与图像date,相机型号名称,曝光等有关的各种信息…