提取图像文件元数据

时间:2014-07-26 12:49:07

标签: c# windows

我希望能够在不打开文件的情况下提取图像的元数据和扩展属性。换句话说,如何以编程方式访问右键单击Windows中的文件时显示的信息,并选择"详细信息"标签

Screenshot

使用.Net Framework 4.5及更高版本执行此操作的正确方法是什么?我已经找到了各种方法来做到这一点,但文章都提到了.Net Framework 2,至少可以说是单调乏味且可能已经过时了。具体来说,是否有任何库可以使这很容易?

修改

我需要能够以下列格式获取图像的高度和宽度尺寸:png,jpg,jpeg,gif,bmp和pdf(可以安全地假设pdf仅包含1页)。< / p>

3 个答案:

答案 0 :(得分:3)

我正在玩这个来完成这件事。以下是我的发现。

  1. 您可以使用System.Drawing和System.Drawing.Imaging名称空间
  2. 后者是通过using语句导入并执行Add reference =&gt; Assemblies =&gt; Framework =&gt; System.Drawing中
  3. 找出存储在PropertyItems Id值中的十六进制值的含义。
  4. 使用ASCII转换器将它们转换为人类可读的文本。*
  5. 打印到屏幕,或其他任何内容。
  6. *请注意: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对象。然后,您可以获得维度的HeightWidth属性,PropertyIdListPropertyItems可获取其他可用信息。

BTW,据我所知,每种图像格式都有高度和宽度。