利用Microsoft Pro Photo Tools 2.0进行图像元数据操作

对于.NET开发者来说,处理图像元数据可能并不是一个常见的任务,但在需要时,会发现可用的工具并不多。ImageMagick的.NET实现可能并不总是最新的,而且使用它可能会让人感到困惑。幸运的是,发现了一种更好的方法,那就是使用微软自家的免费工具。需要注意的是,这些方法并非基于微软官方支持的.NET SDK,因此如果决定在生产环境中使用这些代码,需要意识到这一点。

微软推出了一个名为Pro Photo Tools 2.0的实用工具,用于查看和编辑图像的EXIF/IPTC/XMP元数据。这个工具支持包括相机制造商专有的RAW格式在内的多种图像格式。这个工具附带了一些DLL文件,将在C#应用程序中使用这些DLL来查看和更新元数据。

这需要广泛使用.NETReflector和Visual Studio的调试器...以及在发现过程中对着电脑大喊大叫。

老实说,这个想法并不完全是原创的。在互联网上某个论坛上,有人讨论过使用Pro Photo Tools第一版(称为PhotoInfo)捆绑的DLL。从1.0版本到2.0版本,微软处理元数据的方式发生了根本性的变化,所以认为写一篇关于这个话题的文章是值得的。

设置

下载并安装Microsoft Pro Photo Tools 2.0软件,然后在Visual Studio 2008中创建一个C#控制台应用程序,并引用位于%PROGRAMFILES%\Microsoft Pro Photo Tools目录下的Microsoft.ImageMetadata.dll。这个DLL包含了读取和写入图像元数据的所有好东西。

剖析Pro Photo Tools DLLs

这需要一些.NET Reflector的技巧。打开Microsoft.ProPhotoToolsFoundation.dll,浏览到Resources文件夹,并将Microsoft.PhotoToolboxFoundation.ToolboxPolicy.xml保存到计算机的本地目录。将在将要编写的C#代码中引用这个文件。

代码

信不信由,最难的部分已经完成了!引用DLL。现在,只需要在测试C#应用程序中编写以下代码:

try { var img_path = @"C:\[PATH TO YOUR IMAGE FILE].jpg"; var p = (new MetadataPolicyManager()).loadPolicy(@"C:\[PATH TO POLICY FILE]\Microsoft.PhotoToolboxFoundation.ToolboxPolicy.xml"); imgProxy = new ImageFileProxy(img_path, p); object desc = imgProxy.Data[p.getTagIndex("Description")]; Console.WriteLine("Description: " + desc.ToString()); imgProxy.Data[p.getTagIndex("Description")] = "Description modified!"; imgProxy.commit(); } catch (Exception ex) { // write exception handler }

img_path是想要检查或更改元数据的图像文件的路径。还记得用.NETReflector提取的政策XML吗?指向loadPolicy()的位置。

发生了什么

当运行应用程序时,可以看到,从图像元数据中提取了描述,并在控制台屏幕上显示了它。就是这样!

就是这样?

是的,尽管看起来没什么大不了的,但这就是全部。这就是它的美:简单!imgProxy(ImageFileProxy)基本上承担了将元数据加载到内存中的艰苦工作,而imgProxy.Data(一个数组)是包含所有图像元数据的blob。如果通过调试器运行应用程序并检查imgProxy,将看到其余的图像元数据!不仅如此,该数组包含为反序列化的数据对象,而不仅仅是一些需要格式化以供显示的字节序列。

政策文件是什么

这就是魔法发生的地方。还没有完全理解它,但可以说,它处理了图像元数据和图像文件头中元数据位置之间的所有“映射”。不需要知道元数据的“位置”(无论是XMP、IPTC还是EXIF!),p.GetTagIndex()为做了!如果需要知道其余的元数据关键字,所要做的就是查看政策XML文件。这里有一些可用的关键字:

  • 描述
  • 关键词
  • 版权
  • 评分
  • 主题参考
  • 来源
  • 类别
  • 捕获日期
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485