Особливості та функціональні можливості
Функції та можливості
Ця сторінка охоплює всі області функціональності Aspose.Imaging FOSS для .NET ʼs виявлення формату та дослідження заголовка API, з робочими прикладами C#. Бібліотека ніколи не декодує піксельні дані — кожен метод читає лише заголовок файлу.
Виявлення формату
ImageProbe є статичною точкою входу. Три перевантаження охоплюють шлях до файлу, потік і масив необроблених байтів:
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Використовуйте DetectFormat, коли вам потрібно лише розгалужуватись за форматом; використовуйте Probe/ProbeFile, коли також потрібні розміри, глибина кольору або кількість кадрів.
Читання метаданих заголовка
ProbeFile/Probe повертають ImageInfo з nullable Width, Height, BitDepth і FrameCount — кожен заповнюється лише коли заголовок виявленого формату дійсно містить це значення:
var info = ImageProbe.ProbeFile("scan.dcm");
if (info.Width.HasValue && info.Height.HasValue)
{
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}");
}Format (значення перерахування ImageFormat) завжди встановлюється, як тільки заголовок розпізнано — це єдине поле, гарантує заповнення.
Примітки по форматах
Деякі формати мають особливості заголовка, які ImageInfo нормалізує або безпосередньо розкриває:
| Формат | Behavior |
|---|---|
| GIF | FrameCount відображає кількість кадрів, коли файл містить кілька кадрів; пропускається, якщо кількість неможливо визначити |
| BMP | Від’ємна висота в заголовку (порядок рядків зверху вниз) нормалізується — Height повертає позитивне значення |
| DICOM | Парсинг заголовка підтримує синтакси передачі Implicit VR Little Endian та Explicit VR Little/Big Endian, витягуючи рядки, стовпці та виділені біти |
// DICOM: rows -> Height, columns -> Width, bitsAllocated -> BitDepth,
// across any of the three common transfer syntaxes
var dicomInfo = ImageProbe.Probe(dicomBytes);
Console.WriteLine($"{dicomInfo.Width}x{dicomInfo.Height}, {dicomInfo.BitDepth}-bit");Підтримувані формати
Усі 11 форматів виявляються однаковим способом — ImageProbe визначає формат і читає метадані заголовка; він ніколи не декодує і не перекодує піксельні дані жодного з них. Заповнення полів дійсно різниться залежно від формату, хоча — кожен формат встановлює Format, але лише деякі містять глибину кольору або кількість кадрів у своєму заголовку:
| Формат | Ширина / Висота | Бітова глибина | Кількість кадрів |
|---|---|---|---|
| PNG | ✓ | ✓ | ✓ |
| JPEG | ✓ | ✓ | — |
| GIF | ✓ | — | ✓ |
| BMP | ✓ | ✓ | — |
| WebP | ✓ | — | — |
| ICO | ✓ | ✓ | ✓ |
| TIFF | ✓ | ✓ | ✓ |
| PSD | ✓ | ✓ | — |
| EMF | ✓ (з меж) | — | — |
| WMF (розташовуваний) | ✓ (припускає 96 DPI) | — | — |
| DICOM | ✓ (рядки/стовпці) | ✓ (BitsAllocated) | — |
Нерозпізнаний заголовок розв’язується в ImageFormat.Unknown, а не викликає виняток. Декілька помітних деталей заповнення полів: FrameCount у PNG завжди 1 (константа, а не реальне виявлення анімованих PNG-кадрів); FrameCount у ICO — це справжня кількість вбудованих розмірів іконок у каталозі, а байт розмірності 0 у записі каталогу ICO означає 256px згідно специфікації формату; FrameCount у TIFF відображає обмежений прохід ланцюжка IFD файлу (кожен IFD — це одна сторінка); не-placeable WMF все ще правильно ідентифікується як ImageFormat.Wmf, але повертає лише Format — розміри заповнюються лише для placeable WMF через жорстко закодоване перетворення 96DPI з меж одиниць-на-дюйм заголовка; у EMF взагалі немає явного поля ширини/висоти, тому його розміри виводяться з прямокутника rclBounds у просторі пристрою.
Стійкість за дизайном
ImageProbe ніколи не викликає виняток при пошкодженому або урізаному вводі. Замість підняття виключення він повертає частковий ImageInfo — Format встановлюється щоразу, коли маркер формату заголовка був розпізнаний, навіть якщо решта файлу скорочена або пошкоджена:
byte[] truncated = fullFileBytes[..^3];
var info = ImageProbe.Probe(truncated);
// info.Format is still populated; other fields may be nullЦе робить безпечним запуск проти недовірених, часткових або перебігаючих завантажень без try/catch навколо кожного виклику.
Поради та кращі практики
- Використовуйте
DetectFormatзамістьProbe, коли потрібен лише формат, а не розміри - Перевірте
Width/Height/BitDepth/FrameCountнаnullперед їх використанням — вони не заповнюються для кожного формату - Віддавайте перевагу
Probe(stream)замість читання цілого файлу у масив байтів спочатку, коли працюєте з великими файлами ImageProbeповністю статичний — немає інстанції, немаєIDisposable, немає об’єкта конфігурації
Типові проблеми
| Проблема | Причина | Виправлення |
|---|---|---|
Format є ImageFormat.Unknown | Заголовок не відповідає жодному з 11 розпізнаних форматів | Переконайтеся, що файл є одним із PNG, JPEG, GIF, BMP, WebP, ICO, TIFF, PSD, EMF, WMF або DICOM |
Width/Height є null | Заголовок формату не містить цього поля, або заголовок був скорочений до цього поля | Спочатку перевірте Format; не кожне поле заповнене для кожного формату |
| Висота BMP виглядає несподівано позитивною | Вихідний файл використав від’ємну (зверху вниз) висоту у своєму заголовку | Очікується — ImageInfo.Height завжди нормалізується до позитивної величини |
FAQ
Чи ImageProbe декодує піксельні дані?
Ні. Кожен метод читає лише заголовок файлу — розміри, глибину кольору та кількість кадрів — ніколи не вміст пікселів. Декодування та рендеринг виходять за межі цієї бібліотеки.
Що станеться, якщо я досліджу пошкоджений або урізаний файл?
ImageProbe ніколи не генерує виключення для некоректного або урізаного вводу. Він повертає ImageInfo з усіма полями, які вдалося визначити з доступних байтів заголовка — Format встановлюється, коли розпізнано маркер формату.
Чи можу я дослідити потік, який не підтримує перемотування?
Так. Probe(stream) приймає як потоки з можливістю перемотування, так і без неї.
API Reference Підсумок
| Клас / Метод | Опис |
|---|---|
ImageProbe.ProbeFile(path) | Перевірити файл за шляхом, повертаючи ImageInfo |
ImageProbe.Probe(stream) | Перевірити Stream (з можливістю перемотування або без) |
ImageProbe.Probe(data) | Перевірити необроблений byte[] |
ImageProbe.DetectFormat(stream) | Повернути лише ImageFormat для потоку |
ImageProbe.DetectFormat(data) | Повернути лише ImageFormat для byte[] |
ImageInfo | Тип результату: Format, Width, Height, BitDepth, FrameCount |
ImageFormat | Перелічення: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom |