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






4.81/5 (11投票s)
一种使用 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# 代码中的某个位置引用此文件。
代码
信不信由你,难的部分已经完成了!引用 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 开发人员。