65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Microsoft Pro Photo Tools 以编程方式读取和写入照片元数据

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (11投票s)

2009年10月24日

CPOL

4分钟阅读

viewsIcon

132833

一种使用 Microsoft Pro Photo Tools 所用 DLL 更新照片元数据(EXIF、XMP、IPTC 等)的方法。

引言

处理图像(JPG、TIFF,甚至 RAW)文件的元数据(EXIF、IPTC、XMP 等)可能不是 .NET 开发人员经常遇到的任务,但当需要时,令人惊讶的是,可供选择的选项并不多。据我所知,ImageMagick 的 .NET 实现并未得到充分更新,而且没有关于如何使用它而不至于让人头疼的明确信息。

我曾面临此挑战,需要以编程方式更新图像元数据,而使用 ImageMagick 的想法让我望而却步。幸运的是,我发现了一种使用 Microsoft 自己的免费工具来做到这一点的方法。

请注意,这些都不是基于 Microsoft 文档记录的 .NET SDK。他们随时可能更改,因此如果您决定在生产环境中使用该代码,请注意这一点。

背景

Microsoft 推出了这款名为 Pro Photo Tools 2.0 的精美工具,用于查看/编辑图像元数据。它是一款免费软件,用于查看和更新包括相机制造商专有 RAW 格式在内的各种图像格式的 EXIF/IPTC/XMP 信息。该工具附带许多 DLL,我将在 C# 应用程序中使用它们来查看/更新元数据。

这需要广泛使用 .NET Reflector 和 Visual Studio 的调试器……以及在探索过程中通常会在电脑前发出的尖叫和咒骂。;-)

我必须说实话,这个想法并不完全是原创的。在互联网的某个地方有一个关于使用 Pro Photo Tools 第一版(名为 PhotoInfo)附带的 DLL 的论坛讨论。从 1.0 版到 2.0 版,Microsoft 处理元数据的方式发生了根本性变化,因此我认为写一篇关于它的文章可能是有价值的。

设置

下载并安装 Microsoft Pro Photo Tools 2.0 软件,然后启动您的 Visual Studio 2008。创建一个 C# 控制台应用程序,并引用 %PROGRAMFILES%\Microsoft Pro Photo Tools 目录下的 Microsoft.ImageMetadata.dll。此 DLL 包含了读取 **和** 写入图像元数据所需的所有内容。

解构 Pro Photo Tools DLL

这需要一些 .NET Reflector 的魔法技能。打开 Microsoft.ProPhotoToolsFoundation.dll 并浏览到 Resources 文件夹,然后将 Microsoft.PhotoToolboxFoundation.ToolboxPolicy.xml 保存到您计算机上的本地目录。我们将在您编写的 C# 代码中的某个位置引用此文件。

Reflector01.GIF

代码

信不信由你,难的部分已经完成了!引用 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 是您要检查/更改其元数据的图像文件的路径。另外,还记得您使用 .NET Reflector 提取的策略 XML 吗?您将 loadPolicy() 指向该位置。

这里发生了什么?

正如您所见,当您运行应用程序时,这里并没有发生太多事情:您从图像元数据中提取了描述并将其显示在控制台上。仅此而已!

仅此而已?

是的,尽管看起来很平常,但一切就是如此。这就是它的魅力所在:简单!imgProxy (ImageFileProxy) 基本上承担了将元数据加载到内存中的繁重工作,而 imgProxy.Data(一个数组)是包含所有图像元数据的 blob。如果您通过调试器运行应用程序并检查 imgProxy,您将看到图像的其余元数据!不仅如此,该数组还包含表示已为您反序列化的数据的 *对象*,而不仅仅是一系列需要格式化以供显示的字节。

那么策略文件是怎么回事?

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

  • 描述
  • 关键词
  • Copyright
  • 评分
  • SubjectReference
  • 来源
  • 类别
  • CaptureDate

更新元数据

您可能已经注意到,imgProxy.Data 是可读写的。要更新元数据,只需分配一个新值或多个值,然后调用 imgProxy.commit()。同样,简单性是这里的主要卖点。

还有别的吗?

读取/更新图像元数据是 Pro Photo Tools DLL 提供的功能之一。当您检查 DLL 时,还可以通过地理标记来实现,前提是照片的经纬度信息已包含在标题中。当然,这超出了本文的范围;如果您需要在 .NET 应用程序中使用这些功能,我将其留给有冒险精神的 .NET 开发人员。

© . All rights reserved.