【发布时间】:2010-11-14 19:27:56
【问题描述】:
如果可能(出于性能原因),我想在不打开磁盘的情况下查找磁盘上图像的高度/宽度。
图像的 Windows 属性窗格包含宽度、高度、位深度等信息,这让我相信它正在将元数据存储在文件的某个位置。我如何访问这些信息?
【问题讨论】:
标签: c# windows file file-properties
如果可能(出于性能原因),我想在不打开磁盘的情况下查找磁盘上图像的高度/宽度。
图像的 Windows 属性窗格包含宽度、高度、位深度等信息,这让我相信它正在将元数据存储在文件的某个位置。我如何访问这些信息?
【问题讨论】:
标签: c# windows file file-properties
使用 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"));
【讨论】:
stackoverflow上有一些关于如何从图片中读取EXIF信息的问题,如:How to get the EXIF data from a file using C#
【讨论】:
完成此操作的最简单方法是,假设图像是正方形,则以字节为单位取文件大小并取平方根。这将是您的宽度和高度。
256 bytes = 16px x 16px
或者,您可以尝试使用 codeplex library 读取图像的 EXIF 信息
【讨论】:
Windows 不会将(此)元数据存储在文件系统中的任何特殊位置;属性窗口只是从图像文件本身中读取它们。
我不认为 .NET 提供任何功能来从图像中读取元数据而不加载整个图像。如果您只处理有限数量的不同图像格式(例如,仅 JPEG、PNG 和 GIF),那么您自己从图像标题中读取大小应该不会太难。
另一方面,如果您必须处理许多图像格式,也许您可以查看Unix file utility 的源代码。它能够检测许多不同图像格式的大小,并且启动速度非常快。
【讨论】:
为了获取图像的宽度和高度(本质上,如您所说,元数据),您将必须打开文件,解析某种标题信息并获取您想要的想要那样。
您不必阅读所有颜色/位图信息,只需阅读标题即可。
这与 Windows 无需实际执行即可从应用程序文件加载图标的方式相同。
【讨论】:
要读取 Windows 资源管理器显示的属性,您可以使用 Microsoft Shell 控件和自动化 组件。这样做的好处是您不需要任何第三方库(COM 对象已经存在)或用于解析图像标题的其他代码,并且它可以使用多种格式。
可以在related question 的回复中找到示例代码。
【讨论】: