Введение
Aspose.Imaging FOSS для .NET — это бесплатная, лицензированная по MIT, библиотека с открытым исходным кодом для разработчиков .NET, которым нужно знать, что представляет собой файл изображения is — его формат, размеры, битовую глубину и количество кадров — без необходимости выполнять полное декодирование. Статический ImageProbe класс является точкой входа: ProbeFile(path) чтение с диска, Probe(stream) and Probe(data) принимает поток или массив байтов, и DetectFormat(stream) / DetectFormat(data) возвращает ImageFormat значение перечисления без построения полного ImageInfo, для вызывающих, которым нужно лишь ветвиться по формату. Каждый метод пробного определения возвращает an ImageInfo объект с nullable Width, Height, BitDepth, и FrameCount свойства, заполняются только тогда, когда заголовок обнаруженного формата действительно содержит это значение.
Это преднамеренно узкоспециализированный инструмент, и в этом его суть. Он не декодирует пиксели, не рендерит изображения и не преобразует форматы — для этого правильным выбором является коммерческий продукт Aspose.Imaging для .NET (ссылка ниже в разделе Открытый исходный код & лицензирование). Что делает 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, всегда устанавливается после того, как заголовок распознан) вместе с nullable 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 (lossy, lossless, and extended), ICO, TIFF, PSD, EMF, WMF и DICOM. Заполнение полей различается по форматам намеренно, а не из-за пропуска — PNG содержит ширину, высоту, глубину цвета, and количество кадров (хотя FrameCount является жёстко заданным 1, а не реальное обнаружение кадров анимированного PNG); FrameCount является подлинным счётом вложенных размеров иконок в её каталоге, и a 0 байт в поле размеров записи каталога ICO означает 256px, согласно спецификации формата; TIFF FrameCount отражает ограниченный обход цепочки IFD файла, один IFD на страницу.
Три из этих одиннадцати — PSD, EMF/WMF и DICOM — не имеют другого бесплатного, открытого .NET детектора, о котором нам известно, что является одной из реальных причин существования этой библиотеки.
WMF и EMF: два наследуемых формата, два разных ограничения
Непереносимый WMF всё ещё корректно определяется как ImageFormat.Wmf, но только переносимый WMF заполняет размеры — они выводятся из границ единиц-на-дюйм в заголовке посредством жёстко заданного преобразования 96 DPI, поскольку сам WMF не содержит абсолютного размера в пикселях. EMF вовсе не имеет отдельного поля ширины/высоты; его размеры берутся из прямоугольника устройства rclBounds в заголовке EMF. Оба случая честно отражаются в ImageInfo: когда значение нельзя вывести, свойство остаётся null, а не угадывается.
Разбор заголовка DICOM без просмотрщика
ImageProbe читает заголовки DICOM в синтаксисах передачи Implicit VR Little Endian и Explicit VR Little/Big Endian, извлекая 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 buildusing 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 позволяет использовать её как в open-source, так и в коммерческих проектах без роялти и ограничений на перераспространение. Исходный код доступен на GitHub. Он намеренно ограничен только определением формата — для декодирования, редактирования или конвертации этих форматов изображений см. Aspose.Imaging для .NET — Enterprise Product.