【问题标题】:Read extended image properties in c#在 C# 中读取扩展图像属性
【发布时间】:2010-11-14 19:27:56
【问题描述】:

如果可能(出于性能原因),我想在不打开磁盘的情况下查找磁盘上图像的高度/宽度。

图像的 Windows 属性窗格包含宽度、高度、位深度等信息,这让我相信它正在将元数据存储在文件的某个位置。我如何访问这些信息?

【问题讨论】:

标签: c# windows file file-properties


【解决方案1】:

使用 System.Drawing.Image 类。

        Image img = Image.FromFile(fileName);
        ImageFormat format = img.RawFormat;
        Console.WriteLine("Image Type : "+format.ToString());
        Console.WriteLine("Image width : "+img.Width);
        Console.WriteLine("Image height : "+img.Height);
        Console.WriteLine("Image resolution : "+(img.VerticalResolution*img.HorizontalResolution));

        Console.WriteLine("Image Pixel depth : "+Image.GetPixelFormatSize(img.PixelFormat));
        Console.WriteLine("Image Creation Date : "+creation.ToString("yyyy-MM-dd"));
        Console.WriteLine("Image Creation Time : "+creation.ToString("hh:mm:ss"));
        Console.WriteLine("Image Modification Date : "+modify.ToString("yyyy-MM-dd"));
        Console.WriteLine("Image Modification Time : "+modify.ToString("hh:mm:ss"));

【讨论】:

    【解决方案2】:

    stackoverflow上有一些关于如何从图片中读取EXIF信息的问题,如:How to get the EXIF data from a file using C#

    【讨论】:

    • EXIF 数据存储在文件中,因此需要打开它。哪个不符合 OP 的标准 - 不要说 OP 的标准有任何意义:)
    • 我认为OP的要求更多的是他想要跳过解压缩图像和为位图数据分配内存的方向。如果是这样,访问元数据就可以了。
    • IMO 他的意思是不加载实际的图像数据,打开和读取元数据应该没问题。否则无法检查该文件。真正的性能瓶颈将是加载图像数据,而不是元数据。
    【解决方案3】:

    完成此操作的最简单方法是,假设图像是正方形,则以字节为单位取文件大小并取平方根。这将是您的宽度和高度。

    256 bytes = 16px x 16px
    

    :-)

    或者,您可以尝试使用 codeplex library 读取图像的 EXIF 信息

    【讨论】:

    • 图片是正方形的大假设。
    • 哇!图像可能不是方形的。嗯嗯,这把扳手扔进去了! ;)
    • 对于不是正方形的图像,这种方法变得无限困难。
    • 投票只是因为它很酷。可能不正确,但很清楚。
    • 一个完美的方形位图笑话?还是这种压缩的、非方正的玩笑?
    【解决方案4】:

    Windows 不会将(此)元数据存储在文件系统中的任何特殊位置;属性窗口只是从图像文件本身中读取它们。

    我不认为 .NET 提供任何功能来从图像中读取元数据而不加载整个图像。如果您只处理有限数量的不同图像格式(例如,仅 JPEG、PNG 和 GIF),那么您自己从图像标题中读取大小应该不会太难。

    另一方面,如果您必须处理许多图像格式,也许您可​​以查看Unix file utility 的源代码。它能够检测许多不同图像格式的大小,并且启动速度非常快。

    【讨论】:

      【解决方案5】:

      为了获取图像的宽度和高度(本质上,如您所说,元数据),您将必须打开文件,解析某种标题信息并获取您想要的想要那样。

      您不必阅读所有颜色/位图信息,只需阅读标题即可。

      这与 Windows 无需实际执行即可从应用程序文件加载图标的方式相同。

      【讨论】:

        【解决方案6】:
        【解决方案7】:

        要读取 Windows 资源管理器显示的属性,您可以使用 Microsoft Shell 控件和自动化 组件。这样做的好处是您不需要任何第三方库(COM 对象已经存在)或用于解析图像标题的其他代码,并且它可以使用多种格式。

        可以在related question 的回复中找到示例代码。

        【讨论】:

          猜你喜欢
          • 2016-04-06
          • 2021-03-11
          • 2010-09-18
          • 1970-01-01
          • 2018-07-08
          • 2017-02-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多