介绍

Aspose.Imaging FOSS for .NET 是一个免费、MIT 许可证的开源库,供需要了解图像文件的 .NET 开发者使用 is —其格式、尺寸、位深和帧数—而无需付出解码的成本。静态 ImageProbe 类是入口点: ProbeFile(path) 从磁盘读取, Probe(stream) and Probe(data) 接受流或字节数组,并 DetectFormat(stream) / DetectFormat(data) 返回 ImageFormat 枚举值而无需构建完整的 ImageInfo,供仅需根据格式进行分支的调用者使用。每个探测方法都会返回一个 ImageInfo 可为空的对象 Width, Height, BitDepth,以及 FrameCount 属性,仅在检测到的格式的头部确实包含该值时才填充。

这是一款刻意设计得很狭窄的工具,这正是它的意义所在。它不解码像素、渲染图像,也不在格式之间转换——若需要这些功能,请使用针对 .NET 的商业 Aspose.Imaging 产品(链接见下方的开源与许可章节)。Aspose.Imaging FOSS 为 .NET 所做的,是一个更小、更常见的任务,即快速且安全地回答“这是什么格式,大小是多少?” ,适用于完整解码会造成浪费的场景:验证上传文件、计算缩略图尺寸、对混合文件批次进行分类,或读取 DICOM 头字段进行预处理检查。

该库采用 MIT 许可证,没有任何外部依赖,支持 netstandard2.0 和 net8.0 ——对开源和商业用途均免费,且没有版税或再分发限制。


关键特性

三种文件探测方式

ImageProbe 提供文件路径、流和字节数组的入口点,因此无论图像数据在您的流水线中位于何处——磁盘上、已在内存中,或通过网络传输——都能使用。DetectFormat 在仅需根据格式分支时,跳过构建完整的 ImageInfo。

using Aspose.Imaging.Foss;

var fromPath   = ImageProbe.ProbeFile("photo.jpg");
var fromBytes  = ImageProbe.Probe(byteArray);
var fromStream = ImageProbe.Probe(stream);

var formatOnly = ImageProbe.DetectFormat(byteArray); // ImageFormat only, no header parse

结构化、诚实的结果

ImageInfo 暴露 Format(一个 ImageFormat 枚举值,在识别到头部后始终设置),以及可为空的 Width、Height、BitDepth 和 FrameCount。这里的 “Nullable” 起了真正的作用:字段填充确实会因格式而异,而 ImageInfo 从不捏造格式头部未携带的值。在使用前检查 null 是正确的做法,而不是事后防御性的想法。

var info = ImageProbe.ProbeFile("scan.dcm");
if (info.Width.HasValue && info.Height.HasValue)
{
    Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}");
}

11 种格式,其中包括三种在 FOSS .NET 空间中唯一可检测的

PNG、JPEG、GIF、BMP、WebP(有损、无损和扩展),ICO、TIFF、PSD、EMF、WMF,以及 DICOM。字段填充有意因格式而异,而非因遗漏——PNG 包含宽度、高度、位深, and 帧计数(虽然 FrameCount 是硬编码的 1,并非真正的 animated-PNG 帧检测);JPEG 和 BMP 包含尺寸和位深,但从不包含帧计数;WebP 仅包含尺寸;ICO 的 FrameCount 是其目录中嵌入的图标尺寸的真实计数,并且 a 0 ICO 目录条目尺寸字段中的字节表示 256px,依据格式规范;TIFF 的 FrameCount 反映了文件 IFD 链的有界遍历,每页一个 IFD。

这十一种格式中有三种——PSD、EMF/WMF 和 DICOM——我们所知没有其他免费、开源的 .NET 检测器,这也是该库存在的真实原因之一。

WMF 和 EMF:两种遗留格式,两种不同的限制

非可放置的 WMF 仍然能够正确识别为 ImageFormat.Wmf,但只有可放置的 WMF 会填充尺寸——通过头部的每英寸单位范围并使用硬编码的 96 DPI 转换得出,因为 WMF 本身不携带绝对像素尺寸。EMF 根本没有显式的宽度/高度字段;它的尺寸来自 EMF 头部中的 rclBounds 设备空间矩形。两者都如实体现在 ImageInfo 中:当无法推导出数值时,属性保持 null 而不是猜测。

无查看器的 DICOM 头部解析

ImageProbe 在 Implicit VR Little Endian 和 Explicit VR Little/Big Endian 传输语法中读取 DICOM 头部,将 Rows 提取到 Height,将 Columns 提取到 Width,并将 BitsAllocated 提取到 BitDepth —— 无需 DICOM 查看器或外部成像依赖。解析设计上采用保守策略:未定义长度的序列元素会停止遍历,而不是猜测其内容,因此部分可识别的 DICOM 文件会降级为部分 ImageInfo,而不是错误的结果。

永不在错误或截断的输入上抛出异常

Probe 为不可信、部分或正在传输的文件而构建。如果文件符合某种格式的签名,但其头部无法完整解析——例如下载被截断、上传损坏——结果仅携带检测到的 Format,而不是抛出异常。

byte[] truncated = fullFileBytes[..^3];
var info = ImageProbe.Probe(truncated);
// info.Format is still populated; other fields may be null

快速入门

安装该包后,从磁盘探测文件,以一次调用读取其检测到的格式、尺寸、位深度和帧数,随后使用原始字节进行仅格式检查:

git clone https://github.com/aspose-imaging-foss/Aspose.Imaging-FOSS-for-.NET.git
cd Aspose.Imaging-FOSS-for-.NET
dotnet build
using Aspose.Imaging.Foss;

var info = ImageProbe.ProbeFile("photo.jpg");
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}, {info.BitDepth}-bit, " +
                   $"{info.FrameCount ?? 0} frame(s)");

// Format-only detection when dimensions aren't needed
var bytes = File.ReadAllBytes("photo.jpg");
var format = ImageProbe.DetectFormat(bytes);

支持的格式

Aspose.Imaging FOSS 用于 .NET detects 以下所有 11 种格式并读取头部级别的元数据——它不解码像素数据,因此没有可报告的“write”功能。字段填充因格式而异;详见上文 关键特性 中的详细拆解。

格式扩展名Detected宽度 / 高度位深度帧计数
PNG.png✓✓✓✓
JPEG.jpg / .jpeg✓✓✓—
GIF.gif✓✓—✓
BMP.bmp✓✓✓—
WebP.webp✓✓——
ICO.ico✓✓✓✓
TIFF.tif / .tiff✓✓✓✓
PSD.psd✓✓✓—
EMF.emf✓✓ (来自边界)——
WMF.wmf✓✓ (仅可放置, 96 DPI)——
DICOM.dcm✓✓ (行/列)✓ (BitsAllocated)—

开源与许可

Aspose.Imaging FOSS 用于 .NET 使用 MIT 许可证,且没有外部依赖。MIT 许可证允许在开源和商业项目中使用,且无需版税,也没有再分发限制。源代码可在 GitHub 获取。它的功能仅限于格式检测——如需解码、编辑或转换这些图像格式,请参阅 Aspose.Imaging 了解 .NET —— 企业产品。


开始使用

相关资源