有没有可能使用C#和.NET Framework 2读取图片的IPTC信息?
我没有找到任何解决方案。只有使用.NET Framework 3.0或.NET 3.5才能实现。
有任何帮助或信息吗?
非常感谢来自德国的Stephan!
有没有可能使用C#和.NET Framework 2读取图片的IPTC信息?
我没有找到任何解决方案。只有使用.NET Framework 3.0或.NET 3.5才能实现。
有任何帮助或信息吗?
非常感谢来自德国的Stephan!
好的,我的上一个回答有点混淆。这是一个.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...
我意识到这个答案没有涉及到.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的程序集中,因此您需要引用以下程序集才能使用这些类:
我已经成功地在WinForm应用程序中使用了这种方法,但我怀疑它可以适用于其他应用程序类型。此外,您可以看到在此示例中抽象的“BitmapDecoder”类被分配了一个JpegBitmapDecoder实例,但是您也可以获得另一个解码器的实例来处理您的图像类型(TIFF、GIF、PNG、BMP和WMP也都支持)。
我刚刚在整个网络上搜索了几乎所有的C#解决方案来提取IPTC信息,并在Code Project上找到了这个漂亮而全新的教程:
http://www.codeproject.com/KB/graphics/ReadingIPTCAPP14.aspx
希望能对某些人有所帮助。 :)Stephan,
这两个链接应该会有用:
它们都访问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),例如此搜索结果。
在这里和其他地方尝试了几个建议都没有成功之后,我决定编写一个类来调用exiv2命令行工具。在我的场景中,为每个图像生成进程会有一些性能损失,但在其他情况下可能不是这样。
如果它是在3.x中实现的,那么在早期版本中就不存在。
然而,有第三方库可以完成这个技巧。ImageMagick就是其中之一。如果你正在寻找一个更简单(且免费)的实现,这个文章或者谷歌搜索可能会带你找到解决方案。
祝你好运。