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

时间:2009-03-25 08:15:41

标签: c# iptc

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

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

任何帮助,任何信息?

非常感谢德国!  斯蒂芬

6 个答案:

答案 0 :(得分:3)

好的,我之前的回答有点'困惑'。以下是.NET 2.0项目(Visual Studio 2008 SLN格式)的链接,该项目提供了一些基本的“提取”功能MetaExtractor ZIP (25Kb)

CODE SNIP:

// 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...

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

答案 1 :(得分: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)。

答案 2 :(得分:1)

斯蒂芬,

这两个链接应该是有用的

Reading XMP metadata from JPEG

EXIF extractor (on CodeProject)

它们都访问JPEG标头的略微不同的部分,以提取可嵌入的各种元数据。我在Searcharoo (which you can download)中使用了他们的代码,并从此DeepZoom example的JPEG中提取纬度/经度。

您可以从此13kb code ZIP抓取我的JpegParser.cs课程 - 它只会抓取几个属性(标题/说明/关键字/评级/纬度 - 经度),但您应该能够看到代码在哪里提取更多== SEE EDIT BELOW ==

注意:努力工作全部由上面链接的两篇文章的作者完成。

下面的

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

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

答案 3 :(得分:1)

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

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

希望它有所帮助。 :)

答案 4 :(得分:0)

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

然而,有第三方库可以做到这一点。 ImageMagick就是其中之一。如果您正在寻找更简单(且免费)的实施方式,此article或Google搜索可能会引导您找到解决方案。

祝你好运。

答案 5 :(得分:0)

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

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