提取图像文件元数据

6
我希望能够在不打开文件的情况下提取图片的元数据和扩展属性。换句话说,我如何以编程方式访问在Windows中右键单击文件并选择“详细信息”选项卡时显示的信息?使用.NET Framework 4.5及更高版本,正确的实现方法是什么?我已经找到了各种方法来做到这一点,但是这些文章都只涉及.NET Framework 2.0,而且非常繁琐,可能已经过时了。具体来说,是否有任何库可以使此操作变得更容易?
编辑: 我需要能够获取以下格式图片的高度和宽度尺寸:png、jpg、jpeg、gif、bmp和pdf(可以安全地假定pdf只包含1页)。

你需要哪些元数据? - Jim Rhodes
具体来说,是高度和宽度(目前只有这两个)。根据我所阅读的文章,有些提到并非所有图像都可以获得此数据?如果我能找到一个可以轻松解决这个问题的库,那将是一个奖励(但出于性能原因,我更倾向于首先尝试读取exif数据)。 - CShark
这可能是你正在寻找的:https://dev59.com/LnVD5IYBdhLWcg3wO5ID - sasha_gud
3个回答

3

我为了实现这个而进行了一些尝试。以下是我的发现:

  1. 您可以使用System.Drawing和System.Drawing.Imaging命名空间
  2. 后者通过使用语句导入,并执行添加引用 =>程序集 =>框架 =>System.Drawing
  3. 找出在PropertyItems Id值中存储的十六进制值的含义。
  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类,通过Metadata属性公开EXIF元数据可能更容易。


1
我个人曾因项目需要而亲自进行过此操作,读取XMP数据。
我使用了http://sourceforge.net/projects/csxmptk/,它是Adobe XMP工具包的一个包装器。
虽然不是最高效的方法,但对于我来说这不是一个问题,因为我在上传资产时批处理完成。

1
当然,需要有东西打开文件以读取元数据。也就是说,这可能不是最有效的方法,但是System.Drawing.Image类应该可以提供您所需的一切。使用FromFile创建Image对象。然后您就有了HeightWidth属性来获取尺寸,以及PropertyIdListPropertyItems来获取其他可能可用的信息。
顺便说一句,据我所知,每种图像格式都可以获得高度和宽度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接