使用C#、.NET Framework 2读取IPTC信息

4

有没有可能使用C#和.NET Framework 2读取图片的IPTC信息?

我没有找到任何解决方案。只有使用.NET Framework 3.0或.NET 3.5才能实现。

有任何帮助或信息吗?

非常感谢来自德国的Stephan!


只是想澄清一下 - 关于3.0/3.5 - 这是否使用WPF? - Marc Gravell
据我所知,3.0/3.5使用WPF读取IPTC信息。而2.0不支持WPF。 - Stephan
有没有通用的解决方案可以在2.0下使用3.0/3.5的功能? - Liam
2
是的。升级吧。没有理由不这样做。.NET 3.0和3.5是增量的。它们不会替换.NET 2.0。它们只是应用了两个服务包——到.NET 2.0 SP2上。你也不需要Visual Studio 2008来升级。你可以直接升级框架。 - John Saunders
升级运行在.NET 2.0上的自定义软件的Windows 2003服务器是否存在任何风险或副作用?我只需应用更新并重新启动即可吗? - Liam
这个IPTC技术规范可能会很有用:https://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf - sj26
6个回答

3

好的,我的上一个回答有点混淆。这是一个.NET 2.0项目(Visual Studio 2008 SLN格式)的链接,提供了一些基本的“提取”功能MetaExtractor ZIP(25Kb)

代码片段:

// The Parser class extracts the data to hardcoded properties.
// it's 1200 lines - too many to post on StackOverflow
JpegParser parser = new JpegParser(path);
if (parser.ParseDocument())
{
    Console.WriteLine("Parsed {0} {1}", System.IO.Path.GetFileName(path), parser.Title);
    Console.WriteLine("Tags: {0}", parser.KeywordString);
    Console.WriteLine("Description: {0}", parser.Description);
    Console.WriteLine("Title: {0}", parser.Title);
    Console.WriteLine("Rating: {0}", parser.Rating);
}

用法:

MetaExtractor "C:\Users\Craig\Pictures\anton-1.jpg"

输出:

 == DeepZoomPublisher MetaExtractor v0.1 ==
Parsed anton-1.jpg Beach Photo
Tags: beach, blue sky
Description: Anton
Title: Beach Photo
Rating: 3

Press any key to exit...

希望这个回答比之前的更有帮助。

2

我意识到这个答案没有涉及到.NET framework v2,但我认为对于那些使用.NET 3.5或更高版本的人来说,这是值得记录的。在3.0中可能也有效,但我没有在那里测试过。

下面的函数调用将返回嵌入在JPEG图像中的关键字:

    private string[] GetKeywords(string filespec)
    {
        BitmapDecoder decoder = new JpegBitmapDecoder(new FileStream(filespec, FileMode.Open), BitmapCreateOptions.None, BitmapCacheOption.None);
        BitmapMetadata meta = (BitmapMetadata)decoder.Frames[0].Metadata;
        return meta.Keywords.ToArray<string>();
    }

BitmapDecoder和BitmapMetadata类包含在通常用于WPF的程序集中,因此您需要引用以下程序集才能使用这些类:

  • PresentationCore
  • WindowsBase

我已经成功地在WinForm应用程序中使用了这种方法,但我怀疑它可以适用于其他应用程序类型。此外,您可以看到在此示例中抽象的“BitmapDecoder”类被分配了一个JpegBitmapDecoder实例,但是您也可以获得另一个解码器的实例来处理您的图像类型(TIFF、GIF、PNG、BMP和WMP也都支持)。


1

Photoshop段是APP13,而不是文章所说的APP14。使用正则表达式解析JPEG、Photoshop资源和IPTC记录似乎也不是一个好主意。 - sj26

1

Stephan,

这两个链接应该会有用:

从JPEG中读取XMP元数据

EXIF提取器(在CodeProject上)

它们都访问JPEG头的略微不同的部分,以提取可以嵌入的各种元数据。我已经在Searcharoo(您可以下载)和提取JPEG的纬度/经度用于此DeepZoom示例中使用了它们的代码。

你可以从这个13kb code ZIP获取我的JpegParser.cs类 - 它只会抓取一些属性(标题/描述/关键字/评分/纬度-经度),但是你应该能够在代码中看到提取更多属性的位置==请参见下面的编辑==

注意:上面链接的两篇文章的作者已经完成了大部分工作。

编辑:下面的评论指出我上面提到的JpegParser.cs 包括对 using System.Windows.Media.Imaging;BitmapImage img = new BitmapImage(new Uri(filename)); 的引用。这些是作为一个(未完成的)增强功能的一部分添加的,因此它们可以安全地删除,然后JpegParser.cs类应该在2.0中运行(虽然包含项目不会-对造成的混淆表示抱歉)。

或者,您可以从Searcharoo中的JpegDocument.cs类获取类似的代码(需要进行一些编辑)- 这是一个.NET 2.0应用程序,用于索引文件(包括JPEG),例如此搜索结果


你的JpegParser.cs文件使用了System.Windows.Media.Imaging,并引用了PresentationCore程序集。这不意味着它不能在.NET Framework 2.0上工作吗? - Liam
啊,抱歉,我把两个不同的项目搞混了。TagUpdater代码是3.5版本的;但是它基于这个Searcharoo类,该类肯定是2.0兼容的。 http://searcharoo.codeplex.com/SourceControl/changeset/view/20374#490868 ...我发布了链接,因为它是一个小型、自包含的项目,但忘记了WPF的包含。结果发现System.Windows.Media.Imaging和BitmapImage引用可以被删除——我猜只完成了一半。我也会更新我的帖子。 - Conceptdev

0

在这里和其他地方尝试了几个建议都没有成功之后,我决定编写一个类来调用exiv2命令行工具。在我的场景中,为每个图像生成进程会有一些性能损失,但在其他情况下可能不是这样。

  • 使用System.Process调用exiv2.exe
  • 传递参数“-pi filename.jpg”以输出所有IPTC字段
  • 使用System.Process.StandardOutput.ReadToEnd()读取输出;
  • 可以使用Regex将输出分成其各个部分

0

如果它是在3.x中实现的,那么在早期版本中就不存在。

然而,有第三方库可以完成这个技巧。ImageMagick就是其中之一。如果你正在寻找一个更简单(且免费)的实现,这个文章或者谷歌搜索可能会带你找到解决方案。

祝你好运。


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