最快方式是直接读Image.Width/Height,但需确保图片已成功加载;否则可能返回0或抛异常,应配合try/catch及FileStream使用,并注意跨平台兼容性。
用 Image.Width 和 Image.Height 最快,但得先确认图片加载成功
直接读 width / height 属性是 c# 里最常用也最轻量的方式,但它依赖于 image 对象已完整解码——如果图片路径错、格式损坏、或用了异步加载但没等完,这时读出来可能是 0 或抛 argumentexception。
常见错误现象:Image.FromFile("xxx.jpg") 报 “参数无效”,或者宽高返回 0;本质是 GDI+ 在底层加载失败,但没立刻暴露异常。
- 务必用
try/catch包住Image.FromFile或Image.FromStream - 从网络或用户选择的文件加载时,优先用
FileStream并设FileAccess.Read,避免被其他进程锁住 - 如果只是查尺寸不渲染,别用
PictureBox.Image赋值后再读——它可能触发额外缩放或缓存逻辑
Bitmap 构造后立刻读尺寸更稳,但有内存和格式限制
Bitmap 是 Image 的子类,构造时强制解析像素数据,所以一旦 new 成功,Width/Height 就可靠。但它不支持所有格式(比如 WebP 在 .NET Framework 下原生不认,.NET 6+ 需要 System.Drawing.Common + 额外编码器)。
使用场景:你明确知道图像是 BMP/JPEG/PNG,且需要后续做像素操作(裁剪、滤镜等)。
- 用
new Bitmap(stream)时,确保 stream.Position == 0,否则读到空数据 - 构造完记得
Dispose(),Bitmap占 GDI 句柄,不释放会快速触发 “Out of GDI resources” - .NET Core / .NET 5+ 默认禁用
System.Drawing的部分图像格式,需在 csproj 加<PackageReference Include="System.Drawing.Common" Version="8.0.0" />
纯头信息解析(不加载像素)适合大图或批量检查
如果只关心尺寸,又怕加载几百 MB 的 TIFF 或高清 PNG 撑爆内存,可以跳过解码,直接读文件头。JPEG、PNG、BMP 都在前几十字节存了宽高字段。
性能影响:耗时微秒级,内存占用恒定 ~1KB;但得自己写解析逻辑,不同格式规则不一样。
- JPEG:找
0xFFD8(SOI)之后的0xFFC0(SOF0)段,再取第 5–8 字节 - PNG:固定偏移 16 字节处开始的 4 字节是宽,再 4 字节是高(大端)
- 别用正则或字符串查找二进制流——容易错位,老实用
BinaryReader配合Seek
WPF 或 MAUI 项目别混用 System.Drawing
在 WPF、WinUI、MAUI 里硬拉 System.Drawing.Image,编译可能过,运行时大概率崩在 NotSupportedException 或黑屏——因为这些框架默认走 DirectX / Skia 渲染,和 GDI 不兼容。
正确路径:WPF 用 BitmapImage + PixelWidth/PixelHeight;MAUI 用 Microsoft.Maui.Graphics.Image 的 Size 属性。
-
BitmapImage必须等DownloadCompleted事件触发后才能读尺寸,异步是必须的 - MAUI 中如果从
Stream构造Image,传入的 stream 必须支持CanSeek == true,否则Size返回 (0,0) - 跨平台项目里,条件编译
#if WINDOWS再用System.Drawing,比硬切更稳妥
事情说清了就结束









