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