我希望能够在不打开文件的情况下提取图像的元数据和扩展属性。换句话说,如何以编程方式访问右键单击Windows中的文件时显示的信息,并选择"详细信息"标签
使用.Net Framework 4.5及更高版本执行此操作的正确方法是什么?我已经找到了各种方法来做到这一点,但文章都提到了.Net Framework 2,至少可以说是单调乏味且可能已经过时了。具体来说,是否有任何库可以使这很容易?
我需要能够以下列格式获取图像的高度和宽度尺寸:png,jpg,jpeg,gif,bmp和pdf(可以安全地假设pdf仅包含1页)。< / p>
答案 0 :(得分:3)
我正在玩这个来完成这件事。以下是我的发现。
PropertyItems
Id
值中的十六进制值的含义。*请注意:ASCII转换器打印出一堆奇怪的字符(例如,&#34;♦☺☺☻♥♣☺☺☻☺☺☻♥♥♣♥♥♀♥♥♣&#34;)我的笔记本电脑开始发出哔哔声。您可能需要其他编码。如果有人知道,请告诉我。
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状态的评论,使用BitmapSource class, which exposes the EXIF metadata through the Metadata property可能更容易。
答案 1 :(得分:1)
我亲自完成了这项工作,因为我需要为我的一个项目阅读XMP数据。
为此,我使用了:http://sourceforge.net/projects/csxmptk/,这是Adobe XMP工具包的包装。
这不是最高效的,但这对我来说不是一个问题,因为我在上传资产时将其作为批处理过程。
答案 2 :(得分:1)
当然,有些东西需要打开文件来读取元数据。话虽如此,它可能不是最有效的方式,但System.Drawing.Image
课程应该为您提供所需的一切。使用FromFile
创建Image对象。然后,您可以获得维度的Height
和Width
属性,PropertyIdList
和PropertyItems
可获取其他可用信息。
BTW,据我所知,每种图像格式都有高度和宽度。