我希望能够提取图像的元数据和扩展属性,而无需打开文件。 换句话说,如何在Windows中右键单击文件时以编程方式访问所显示的信息,然后select“详细信息”(Details)选项卡?
使用.Net Framework 4.5和更高版本的正确方法是什么? 我已经find了各种各样的方法,但是这些文章都提到.Net Framework 2,至less是乏味的,可能已经过时了。 具体来说,是否有任何一个库容易做到这一点?
我需要能够以下列格式获得图像的高度和宽度尺寸:png,jpg,jpeg,gif,bmp和pdf(假设pdf仅由1页组成)是安全的。
我正在玩耍来完成这一点。 以下是我的发现。
PropertyItems
Id
值中的十六进制值是什么意思。 *请注意:ASCII转换器会打印出一堆奇怪的字符(比如“♦☺☺☻♥♣☺♦☺☺☺☺☻♥♣☺☻♥♦♀☻♥♣”),我的笔记本电脑开始哔哔声一些属性。 你可能需要其他的编码。 如果有人知道,让我知道。
using System; using System.Drawing.Imaging; using System.Drawing; using System.Text; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { // Add reference => Assemblies => Framework => System.Drawing // Set the path to your photo file. var path = @"[Path to your image]"; // Create image object var image = new Bitmap(path); // Get PropertyItems var propItems = image.PropertyItems; // Remove encoding object var encodings = new ASCIIEncoding(); // Display foreach (var propItem in propItems) { // The values below come from http://msdn.microsoft.com/en-us/library/xddt0dz7(v=vs.110).aspx // Find al values available with Console.WriteLine(propItem.Id.ToString("x")); if (propItem.Id.ToString("x").Equals("110")) //Equipment model { var model = encodings.GetString(propItem.Value); Console.WriteLine("Model:\t" + model); } if (propItem.Id.ToString("x").Equals("9003")) //ExifDTOriginal { var datetime = encodings.GetString(propItem.Value); Console.WriteLine("Taken:\t" + datetime); } } Console.Read(); } } } // => // Model: FinePix S9500 // Taken: 2012:11:30 13:58:04
希望这可以帮助。 🙂
/作为sasha_gud状态的注释编辑,使用通过元数据属性暴露EXIF元数据的BitmapSource类可能更容易。
当然,有些东西需要打开文件来读取元数据。 这就是说,它可能不是最有效的方式,但System.Drawing.Image
类应该给你你需要的一切。 使用FromFile
创建Image对象。 然后,您将拥有尺寸的Height
和Width
属性,然后PropertyIdList
和PropertyItems
可以获得其他可用的信息。
顺便说一句,据我所知,高度和宽度是可用的每个图像格式。
我自己亲自做过,因为我需要为我的一个项目阅读XMP数据。
要做到这一点,我使用: http : //sourceforge.net/projects/csxmptk/这是Adobe的XMP工具包的包装。
这不是性能最高的,但是这不是我关心的问题,因为我在资源上传时将其作为批处理进行了处理。