Введение

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 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 позволяет использовать её как в open-source, так и в коммерческих проектах без роялти и ограничений на перераспространение. Исходный код доступен на GitHub. Он намеренно ограничен только определением формата — для декодирования, редактирования или конвертации этих форматов изображений см. Aspose.Imaging для .NET — Enterprise Product.


Начало работы

Связанные ресурсы