.NET 4.0框架下的EXIF库

8

我在这个主题上进行了搜索,但是我只找到了2008年的适当主题,因此提出了我的新问题。

我正在使用C# .Net 4.0语言开发一个程序。我的程序目的是从JPEG文件中提取EXIF信息(制造商、型号、地理位置信息等),然后将其填充到MySql / Sql服务器数据库中。

有人能推荐适合这个项目的好库吗?我还想查找相机序列号(我知道这因制造商而异),但如果有人知道任何现有的库可以解决这个问题,那将非常有帮助。

谢谢,并祝您周末愉快


你是在寻找免费的库还是商业的? - Yahia
我两种都考虑。这取决于商业软件的成本,但如果您能推荐任何一个,我很乐意看看。如果有免费的软件可以做同样好的工作,那么我更喜欢它们 :) - thefragileomen
我没有尝试过任何免费的...但是可以看看LeadTools或GdPicture...特别是相机特定信息会很麻烦,因为这些信息经常变化,所以需要经常更新... - Yahia
请查看此处和此处。 - adrianbanks
EXIF自2008年以来就没有改变过。当时相关的内容现在仍然是相关的。 - Hans Passant
“要求我们推荐或寻找书籍、工具、软件库、教程或其他外部资源的问题不适合在 Stack Overflow 上讨论,因为它们往往会吸引主观性答案和垃圾信息。相反,请描述问题以及已经采取的解决方案。” - Felix K.
3个回答

10

metadata-extractor 自2002年起在Java上一直健康发展,现在也支持.NET 3.5及以上版本,并提供了PCL版本。

  • 开源(Apache 2.0)
  • 经过大量测试和广泛使用
  • 支持多种图像类型(JPEG、TIFF、PNG、WebP、GIF、BMP、ICO、PCX...)
  • 支持多种元数据类型(Exif、IPTC、XMP、JFIF等)
  • 支持许多制造商特定字段(Canon、Nikon等)
  • 非常快速(完全处理大约1.33GB的约400张图片只需约3秒),内存消耗低

可通过NuGetGitHub获得。

使用示例:

IEnumerable<Directory> directories = ImageMetadataReader.ReadMetadata(path);

foreach (var directory in directories)
foreach (var tag in directory.Tags)
    Console.WriteLine($"{directory.Name} - {tag.TagName} = {tag.Description}");

(声明:我维护这个库)


然而这是一个很好的库,也许你可以为我们这些仍然被困在.NET4.0中的可怜人提供一个构建版本?那将非常棒!我尝试在VS2015中自己更改目标框架,但似乎你依赖了很多.NET4.5的东西... - mfeineis
1
@vanhelgen,感谢您的反馈!我将为较早版本的.NET添加支持。请参见此新问题 - Drew Noakes
3
@vanhelgen,完成了。1.1.0版本已经上传到NuGet并支持.NET 3.5和4.5。如果您能测试一下并让我知道情况就太好了。 - Drew Noakes
1
我在我的.NET4.0项目中成功地使用了v1.1.0版本,没有遇到任何问题。再次感谢! - mfeineis
1
@DrewNoakes 谢谢,你帮我省了不少时间去研究它。我一定会尝试一下的。 - Libor
显示剩余5条评论

6

4

想要获取基本的EXIF信息(制造商、相机型号、时间、光圈等),可以查看System.Drawing.Image类,尤其是PropertiesItems集合。

这个类有一些缺点。使用它需要将整个图像加载到内存中才能检索EXIF信息(即它有点慢)。它也无法处理不同相机之间不统一的供应商特定字段。

Image.PropertyItems

MSDN:读取图像元数据

PropertyItem.Id

我已经成功地使用它来收集有关我的照片收藏(数以万计的照片,拍摄于各种不同品牌和型号的十几个不同数码相机)的信息。


6
我也使用这个工具获取EXIF信息,发现它运行良好。你知道吗,有一种内置方法可以跳过加载图片而直接获取元数据。这会极大地提高速度!你需要使用Image.FromFile(Stream, false, false)... 在此处查看更多信息:http://msdn.microsoft.com/en-us/library/21zw9ah6.aspx - Scott Rippey
1
如果速度很重要,您也可以为.NET 4.0编译exifLib: http://www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0。在读取单个标记时,它比Image.FromFile(stream,false,false)更快。如果您需要读取大量标记,则内置的框架库可能会更快。 - Simon MᶜKenzie
在exifLib项目页面上有一个有趣的评论:“通过将构造函数的validateImageData参数设置为false,可以提高使用System.Drawing.Image时的性能。” - Yogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接