【问题标题】:Extract image file metadata提取图像文件元数据
【发布时间】:2014-07-26 12:49:06
【问题描述】:

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

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

编辑

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

【问题讨论】:

  • 您到底在寻找什么元数据?
  • 具体高度和宽度(目前)。从我读过的文章中,有人提到这些数据并不总是适用于所有图像?如果我能找到一个可以轻松解决这个问题的库,那将是一个奖励(但出于性能原因,我希望它首先尝试读取 exif 数据)。
  • 这可能就是你要找的:stackoverflow.com/questions/42017/…

标签: c# windows


【解决方案1】:

我一直在玩弄这个。以下是我的发现。

  1. 您可以使用 System.Drawing 和 System.Drawing.Imaging 命名空间
  2. 后者是通过 using 语句和 Add reference => Assemblies => Framework => System.Drawing 导入的
  3. 找出存储在PropertyItemsId值中的十六进制值的含义。
  4. 使用 ASCII 转换器将它们转换为人类可读的文本。*
  5. 打印到屏幕或其他任何内容。

*请注意: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 的评论状态,使用 BitmapSource class, which exposes the EXIF metadata through the Metadata property 可能更容易。

【讨论】:

    【解决方案2】:

    当然,需要打开文件才能读取元数据。话虽如此,这可能不是最有效的方法,但 System.Drawing.Image 类应该可以为您提供所需的一切。使用 FromFile 创建 Image 对象。然后,您拥有维度的HeightWidth 属性以及PropertyIdListPropertyItems 以获取其他可用信息。

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

    【讨论】:

      【解决方案3】:

      我自己亲自完成了这项工作,因为我需要为我的一个项目读取 XMP 数据。

      为此,我使用了:http://sourceforge.net/projects/csxmptk/,它是 Adob​​e XMP 工具包的包装器。

      这不是性能最高的,但这对我来说不是问题,因为我在上传资产时将其作为批处理进行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 2013-01-09
        • 2013-05-14
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多