4

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

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

任何帮助,任何信息?

非常感谢德国!斯蒂芬

4

6 回答 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...

希望这比我以前的回答更有帮助。

于 2009-04-28T11:29:49.433 回答
2

我意识到这个答案没有解决 .NET 框架 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 中通常使用的程序集中,因此您需要引用以下程序集才能使用这些类:

  • 演示核心
  • 视窗基地

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

于 2011-04-11T17:05:52.940 回答
1

斯蒂芬,

这两个链接应该很有用

从 JPEG 读取 XMP 元数据

EXIF 提取器(在 CodeProject 上)

它们都访问 JPEG 标头的略有不同的部分,以提取可以嵌入的各种元数据。我在Searcharoo(您可以下载)中使用了他们的代码,并为这个DeepZoom 示例从 JPEG 中提取纬度/经度。

JpegParser.cs您可以从这个13kb 代码 ZIP中获取我的课程- 它仅获取几个属性(标题/描述/关键字/评级/纬度-经度),但您应该能够在代码中看到提取更多内容的位置 == 请参阅下面的编辑==

注意:辛勤工作都是由上面链接的两篇文章的作者完成的。

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

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

于 2009-03-29T22:09:47.133 回答
1

我刚刚搜索了几乎整个网络以找到提取 IPTC 信息的 C# 解决方案,并在 Code Project 中找到了这个不错的全新教程:

http://www.codeproject.com/KB/graphics/ReadingIPTCAPP14.aspx

希望它可以帮助某人。:)

于 2011-05-06T14:07:29.397 回答
0

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

但是,有 3rd 方库可以做到这一点。 ImageMagick就是其中之一。如果您正在寻找更简单(且免费)的实现,这篇文章或谷歌搜索可能会引导您找到解决方案。

祝你好运。

于 2009-03-25T15:25:37.497 回答
0

在尝试了来自这里和其他地方的几个建议后,我决定编写一个类来调用 exiv2 命令行工具。在我的场景中,为每个图像生成一个进程的小性能损失是可以接受的,在其他场景中可能不会。

  • 使用 System.Process 调用 exiv2.exe
  • 传递参数“-pi filename.jpg”以输出所有 IPTC 字段
  • 使用 System.Process.StandardOutput.ReadToEnd() 读取输出;
  • 可以使用 Regex 将输出拆分为各个部分
于 2009-04-28T16:42:23.253 回答