Ядро API
Основной API
Aspose.Imaging FOSS для всей публичной поверхности .NET состоит из трёх классов: ImageProbe (статический фасад), ImageInfo (значение результата), и ImageFormat (перечисление формата). Эта страница объясняет, как они сочетаются в виде контракта, помимо обзора по функциям в Функции и возможности.
Контракт из трёх классов
ImageProbe— статический, без состояния. Каждый вызов независим; ничего не нужно настраивать или освобождать.ImageInfo— запечатанный, неизменяемый. Все пять свойств (Format,Width,Height,BitDepth,FrameCount).ImageFormat— перечисление с одним значением для каждого распознанного формата, плюсUnknown.
using Aspose.Imaging.Foss;
var info = ImageProbe.ProbeFile("photo.jpg");
ImageFormat format = info.Format; // always set
int? width = info.Width; // set only when the format's header carries itСоздание ImageInfo напрямую
Конструктор ImageInfo публичный — требуется только format, все остальные параметры по умолчанию равны null. Это полезно для модульных тестов, которым нужен подставной результат без обращения к реальному файлу:
using Aspose.Imaging.Foss;
// Fake a PNG result for a test double, with no dimensions
var fakeInfo = new ImageInfo(ImageFormat.Png);
// Fake a fully-populated result
var fullInfo = new ImageInfo(ImageFormat.Gif, width: 64, height: 48, bitDepth: 8, frameCount: 3);Нет соответствующего способа mutate an ImageInfo после создания — каждое свойство только для чтения, поэтому проверенный или сконструированный экземпляр безопасно передавать и кэшировать без защитного копирования.
Выбор правильной перегрузки
| Overload | Использовать, когда |
|---|---|
ImageProbe.ProbeFile(path) | У вас есть путь к файлу, и вы хотите получить полный ImageInfo |
ImageProbe.Probe(stream) | У вас уже открыт Stream (с возможностью перемещения или без неё), и вы хотите получить полный ImageInfo |
ImageProbe.Probe(data) | У вас уже есть байты в памяти, и вы хотите полный ImageInfo |
ImageProbe.DetectFormat(stream) / (data) | Вам нужно лишь переключиться на ImageFormat — пропустите разбор заголовка после сигнатуры формата |
ProbeFile открывает и читает файл сам — нет необходимости сначала открывать FileStream, лишь бы вызвать Probe(stream).
Пакетное сканирование каталога
Поскольку ImageProbe никогда не бросает исключение, сканирование каталога может вызывать его в плотном цикле без try/catch для каждого файла:
using Aspose.Imaging.Foss;
foreach (var path in Directory.GetFiles("incoming"))
{
var info = ImageProbe.ProbeFile(path);
if (info.Format == ImageFormat.Unknown)
{
Console.WriteLine($"{path}: not a recognized image format, skipping");
continue;
}
Console.WriteLine($"{path}: {info.Format} {info.Width}x{info.Height}");
}Любой файл, заголовок которого не соответствует одному из 11 распознаваемых форматов, преобразуется в ImageFormat.Unknown, а не вызывает исключение — приведённый выше цикл никогда не требует блока catch.
Контракт never-throws
Это не случайное поведение — это преднамеренная часть контракта API. Если заголовок распознаваемого формата обрезан или искажен в процессе разбора, ImageProbe всё равно возвращает ImageInfo с установленным Format, указывающим на распознанный формат; он не передаёт исключение парсинга вызывающему коду. Гарантируется только Format — все остальные свойства следует считать опциональными, независимо от того, какой формат был обнаружен.
Общие проблемы
| Проблема | Причина | Исправление |
|---|---|---|
Сконструированный ImageInfo не совпадает с реальным результатом проба | Вручную созданные экземпляры не проверяют согласованность между полями | Используйте ручное создание тестовых двойников только для этого, а не как замену проверки реальных файлов |
Вызов Probe, когда достаточно DetectFormat | Избыточный разбор заголовка, когда нужен только формат | Используйте DetectFormat, если вы никогда не читаете Width/Height/BitDepth/FrameCount |
Формат Unknown для файла, который, как ожидается, поддерживается | Заголовок не совпадает ни с одной из 11 распознанных сигнатур, либо файл полностью другого формата | Подтвердите файл относительно список поддерживаемых форматов |
FAQ
Могу ли я создать подкласс ImageInfo или ImageProbe?
Нет. ImageInfo является sealed, а ImageProbe — static — ни то, ни другое не предназначено для наследования или создания экземпляров через наследование.
Является ли ImageProbe потокобезопасным?
У ImageProbe нет изменяемого состояния между вызовами — каждый вызов Probe, ProbeFile или DetectFormat независим, что делает одновременные вызовы из нескольких потоков безопасными.
Нужно ли мне что-нибудь освобождать?
Нет. У ImageProbe нет собственных IDisposable ресурсов. Если вы передаёте Stream, который открыли сами, вы остаётесь ответственными за освобождение этого потока — Probe(stream) его не закрывает.
API Reference Сводка
| Класс / Метод | Описание: |
|---|---|
ImageProbe.ProbeFile(path) | Проверить файл по пути |
ImageProbe.Probe(stream) | Проверить Stream |
ImageProbe.Probe(data) | Проверить byte[] |
ImageProbe.DetectFormat(stream) | Только формат, из Stream |
ImageProbe.DetectFormat(data) | Только формат, из byte[] |
ImageInfo(format, width, height, bitDepth, frameCount) | Публичный конструктор — требуется только format |
ImageInfo.Format / .Width / .Height / .BitDepth / .FrameCount | Свойства результата только для чтения |
ImageFormat | Перечисление: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom |