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

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

How to get the EXIF data from a file using C#

我想用C#写一个小程序,通过我的jpeg照片,例如,将它们分类到带日期的文件夹中(使用MY约会约定,该死的...)。

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


如建议的那样,您可以使用一些第三方库,也可以手动进行(这不是很多工作),但是最简单,最灵活的方法是使用.NET中的内置功能。有关更多信息,请参见:

  • System.Drawing.Image.PropertyItems属性

  • System.Drawing.Imaging.PropertyItem类

  • 如何:读取图像元数据

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

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

编辑:可以在不按照以下答案加载完整图像的情况下执行此操作:https://stackoverflow.com/a/552642/2097240


签出此元数据提取器。 它是用Java编写的,但也已移植到C#中。我使用Java版本编写了一个小的实用程序,用于根据日期和模型标签重命名jpeg文件。很好用。

EDIT元数据提取器也支持.NET。这是一个非常快速和简单的库,用于访问图像和视频中的元数据。

它完全支持Exif以及IPTC,XMP和来自文件类型的许多其他类型的元数据,包括JPEG,PNG,GIF,PNG,ICO,WebP,PSD等。

1
2
3
4
5
6
7
8
9
10
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中有关"阅读,书写和照片元数据"的这篇好文章。


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

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


图像类具有PropertyItems和PropertyIdList属性。您可以使用它们。


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

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

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

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


    推荐阅读

      linux文件io命令?

      linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

      改文件linux命令行?

      改文件linux命令行?,地址,系统,工作,信息,数字,文件,命令,设备,密码,权限,lin

      拷贝文件夹linux命令?

      拷贝文件夹linux命令?,系统,地址,服务,信息,密码,情况,单位,项目,命令,文件,l

      打包文件命令linux?

      打包文件命令linux?,系统,时间,工具,名称,命令,文件,目录,格式,表示,详细信

      linux删除命令文件夹?

      linux删除命令文件夹?,系统,数据,通用,文件夹,命令,文件,环境,百度,不了,名

      linux文件io命令?

      linux文件io命令?,系统,设备,时间,地址,平均,信息,服务,工具,报告,网络,嵌入

      linux中文件编辑命令?

      linux中文件编辑命令?,系统,工作,工具,信息,地址,发行,命令,第一,检测,基础,l

      linux文件格式的命令?

      linux文件格式的命令?,设备,命令,系统,文件,标准,代码,情况,电脑,平台,数据,l

      linux命令行编译文件?

      linux命令行编译文件?,代码,系统,项目,工具,网上,手机,电脑,地址,官网,文件,L

      linux下文件写入命令?

      linux下文件写入命令?,系统,信息,文件,名字,电脑,软件,目录,命令,内容,指令,l

      linux命令备份文件夹?

      linux命令备份文件夹?,设备,系统,文件,命令,备份,情况,做好,名字,灵活,数据,l

      linux中日期相关命令?

      linux中日期相关命令?,时间,系统,信息,命令,代码,服务,工作,工具,终端,时分,l

      linux命令大全数据库?

      linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

      linux上数据库的命令?

      linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

      linux命令dm数据库?

      linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

      linux命令deb文件?

      linux命令deb文件?,软件,位置,第一,系统,中心,工具,信息,发行,网站,管理系统

      linux文件夹删除命令?

      linux文件夹删除命令?,系统,命令,不了,档案,名称,通用,文件夹,文件,目录,指

      linux文件类基本命令?

      linux文件类基本命令?,系统,设备,工具,工作,基础,命令,文件,发行,管理,网络,L

      linux文件结构命令?

      linux文件结构命令?,系统,数字,技术,设备,传播,第一,管理,数据,发展,目录,Lin

      linux建个文件夹命令?

      linux建个文件夹命令?,系统,名字,命令,文件,文件夹,环境,不了,名称,数据,密