如何使用C#从文件中获取EXIF数据

时间:2008-09-12 10:43:49

标签: c# exif photography

我想在C#中编写一个小程序,通过我的jpeg照片,例如,将它们分类为过时的文件夹(使用我的约会惯例,该死...)。

有没有人知道以编程方式获取日期和时间或曝光等EXIF数据的相对简单的方法? 谢谢!

8 个答案:

答案 0 :(得分:43)

根据建议,您可以使用某些第三方库,或者手动执行(这不是那么多工作),但最简单和最灵活的可能是使用.NET中的内置功能。有关详情,请参阅:

我说“它是最灵活的”,因为.NET不会试图以任何方式解释或合并数据。对于每个EXIF,您基本上都得到一个字节数组。这可能是好的也可能是坏的,这取决于你实际需要多少控制。

另外,我应该指出,属性列表实际上并不直接对应于EXIF值。 EXIF本身存储在具有重叠ID的多个表中,但.NET将所有内容放在一个列表中并重新定义某些项的ID。但只要您不关心精确的EXIF ID,您就可以使用.NET映射了。

答案 1 :(得分:17)

查看此metadata extractor它是用Java编写的,但也被移植到C#。我使用Java版本编写了一个小实用程序,根据日期和模型标签重命名我的jpeg文件。非常容易使用。


EDIT metadata-extractor 也支持.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);

可通过NuGetcode's on GitHub获取。

答案 2 :(得分:9)

这是指向另一个similar SO question的链接,其中有一个答案指向.Net中"Reading, writing and photo metadata"上的这篇好文章。

答案 3 :(得分:6)

您可以使用TagLib#等应用程序使用的F-Spot。除了Exif之外,它还会读取大量的图像,音频和视频元数据格式。

我也喜欢ExifUtils API,但它有缺陷并且没有积极开发。

答案 4 :(得分:5)

Image类具有PropertyItems和PropertyIdList属性。你可以使用它们。

答案 5 :(得分:4)

从JPEG图像中获取EXIF数据涉及:

  1. 寻找提及EXIF数据开头的JPEG标记。例如通常,oxFFE1是编码EXIF数据时插入的标记,EXIF数据是EXIF数据所在的APPlication段。
  2. 将所有数据从0xFFE1解析为0xFFE2。该数据将是JPEG编码文件中的字节流。
  3. 这些字节的ASCII等价物将包含与图像日期,相机型号名称,曝光等相关的各种信息......

答案 6 :(得分:3)

命令行工具ExifTool by Phil Harvey可以处理许多图像格式 - 包括大量专有的RAW格式 - 并且可以处理各种元数据格式,包括EXIF,GPS,IPTC,XMP,JFIF。

非常易于使用,轻巧,令人印象深刻的应用。

答案 7 :(得分:0)

最近,我使用了此.NET Metadata API。我还写了一个blog post,它显示了使用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);
     }
}