C# 提取图像文件元数据

C# 提取图像文件元数据,c#,windows,C#,Windows,我希望能够在不打开文件的情况下提取图像的元数据和扩展属性。换句话说,当您在windows中右键单击文件并选择“详细信息”选项卡时,如何通过编程访问显示的信息 使用.Net Framework 4.5及更高版本执行此操作的正确方法是什么?我已经找到了各种各样的方法来实现这一点,但是这些文章都提到了.NETFramework2,至少可以说,它是乏味的,而且可能已经过时了。具体来说,是否有任何库可以使这项工作变得简单 编辑 我需要能够获得以下格式的图像的高度和宽度尺寸:png、jpg、jpeg、gi

我希望能够在不打开文件的情况下提取图像的元数据和扩展属性。换句话说,当您在windows中右键单击文件并选择“详细信息”选项卡时,如何通过编程访问显示的信息

使用.Net Framework 4.5及更高版本执行此操作的正确方法是什么?我已经找到了各种各样的方法来实现这一点,但是这些文章都提到了.NETFramework2,至少可以说,它是乏味的,而且可能已经过时了。具体来说,是否有任何库可以使这项工作变得简单

编辑
我需要能够获得以下格式的图像的高度和宽度尺寸:png、jpg、jpeg、gif、bmp和pdf(可以安全地假设pdf仅包含1页)。

我自己做过这件事,因为我需要为我的一个项目读取XMP数据

为此,我使用了:它是Adobe的XMP工具包的包装器


这不是性能最好的,但这对我来说并不重要,因为我在上传资产时是以批处理的方式完成的

当然,需要打开文件才能读取元数据。也就是说,这可能不是最有效的方法,但是
System.Drawing.Image
类应该能提供您所需要的一切。使用
FromFile
创建图像对象。然后,您可以使用尺寸的
Height
Width
属性,以及
PropertyIdList
PropertyItems
来获取其他可用信息


顺便说一句,据我所知,每种图像格式的高度和宽度都是可用的。

。以下是我的发现

  • 可以使用System.Drawing和System.Drawing.Imaging命名空间
  • 后者通过使用语句并执行addreference=>Assemblies=>Framework=>System.Drawing导入
  • 找出存储在
    PropertyItems
    Id
    值中的十六进制值的含义
  • 使用ASCII转换器将它们转换为人类可读的文本*
  • 打印到屏幕上,或者其他什么
  • *请注意: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数据)。这可能就是您要寻找的: