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

Joe*_* Gö 72 c# exif photography

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

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

Jan*_*ich 46

正如所建议的,您可以使用某些第三方库,或者手动执行(这不是那么多工作),但最简单和最灵活的可能是使用.NET中的内置功能.欲了解更多信息:

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

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

  • 访问Bitmap.PropertyItems需要将整个文件读入内存.如果您创建一个Bitmap,访问PropertyItems而不执行任何其他操作,您可以使用XPerf查看您的应用程序访问了该图像文件并将其全部读入内存.对于我的计算机,一个3.4mb的文件成本> 700ms的IO,只是为了通过PropertyItems获得EXIF :(. (9认同)
  • @jrista我经常只想要元数据?大多数时候.例如,假设您想要按一段元数据对一组图像进行排序或过滤.按日期排序是很常见的事情,要获得该信息,您必须进入元数据. (5认同)
  • 相比之下,Picasa的PhotoViewer只能从它接触的每个文件中读取20 - 30k.这些读取仅花费约25ms.哇; 我很想和写那些东西的男/女聊天.(数据是通过使用XPerf分析PhotoViewer的启动来收集的). (4认同)
  • 这个答案展示了如何使用“PropertyItems”**执行此操作,而不加载整个图像**:/sf/answers/38684971/ (2认同)

Dav*_*ths 19

查看此元数据提取器.它是用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);
Run Code Online (Sandbox Code Playgroud)

它可以通过NuGetGitHub上代码获得.


Joe*_* Gö 9

这是一个链接到另一个类似的SO问题,它的答案指向.Net中关于"阅读,写作和照片元数据"的好文章.


smo*_*ola 7

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

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


gol*_*ean 5

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

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


idu*_*sun 5

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

  • 在新图像上使用Image.SetPropertyItem(PropertyItem)函数. (3认同)