Fitur dan Fungsionalitas
Fitur dan Fungsionalitas
Halaman ini mencakup setiap area fitur Aspose.Imaging FOSS untuk .NET’s format-detection dan header-probing API, dengan contoh C# yang berfungsi. Perpustakaan ini tidak pernah mendekode data piksel — setiap metode hanya membaca header file.
Deteksi Format
ImageProbe adalah titik masuk statis. Tiga overload mencakup jalur file, aliran, dan array byte mentah:
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 parseGunakan DetectFormat ketika Anda hanya perlu membranch berdasarkan format; gunakan Probe/ProbeFile ketika Anda juga memerlukan dimensi, kedalaman bit, atau jumlah frame.
Membaca Metadata Header
ProbeFile/Probe mengembalikan sebuah ImageInfo dengan Width yang dapat bernilai null, Height, BitDepth, dan FrameCount — masing-masing diisi hanya ketika header format yang terdeteksi benar-benar membawa nilai tersebut:
var info = ImageProbe.ProbeFile("scan.dcm");
if (info.Width.HasValue && info.Height.HasValue)
{
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}");
}Format (sebuah nilai enum ImageFormat) selalu diatur begitu header dikenali — itu satu-satunya bidang yang dijamin terisi.
Catatan Per-Format
Beberapa format memiliki keanehan header yang ImageInfo menormalkan atau mengekspose secara langsung:
| Format | Behavior |
|---|---|
| GIF | FrameCount mencerminkan jumlah frame ketika file berisi beberapa frame; dihilangkan jika jumlah tidak dapat ditentukan |
| BMP | Ketinggian negatif pada header (urutan baris atas ke bawah) dinormalisasi — Height mengembalikan nilai positifnya |
| DICOM | Parsing header menangani sintaks transfer Implicit VR Little Endian dan Explicit VR Little/Big Endian, mengekstrak baris, kolom, dan bit yang dialokasikan |
// 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");Format yang Didukung
Semua 11 format terdeteksi dengan cara yang sama — ImageProbe mengidentifikasi format dan membaca metadata header; ia tidak pernah mendekode atau mengkode ulang data piksel untuk satupun di antaranya. Pengisian bidang memang berbeda-beda per format, namun — setiap format mengatur Format, tetapi hanya beberapa yang menyertakan kedalaman bit atau jumlah frame di header mereka:
| Format | Lebar / Tinggi | Kedalaman bit | Jumlah frame |
|---|---|---|---|
| PNG | ✓ | ✓ | ✓ |
| JPEG | ✓ | ✓ | — |
| GIF | ✓ | — | ✓ |
| BMP | ✓ | ✓ | — |
| WebP | ✓ | — | — |
| ICO | ✓ | ✓ | ✓ |
| TIFF | ✓ | ✓ | ✓ |
| PSD | ✓ | ✓ | — |
| EMF | ✓ (dari batas) | — | — |
| WMF (dapat ditempatkan) | ✓ (mengasumsikan 96 DPI) | — | — |
| DICOM | ✓ (Baris/Kolom) | ✓ (BitsAllocated) | — |
Header yang tidak dikenali akan diubah menjadi ImageFormat.Unknown alih-alih melemparkan kesalahan. Beberapa detail penting tentang pengisian bidang: FrameCount pada PNG selalu 1 (sebuah konstanta, bukan deteksi frame PNG animasi yang sebenarnya); FrameCount pada ICO adalah hitungan asli ukuran ikon yang tertanam dalam direktori, dan byte dimensi 0 dalam entri direktori ICO berarti 256px sesuai spesifikasi format; FrameCount pada TIFF mencerminkan penelusuran terbatas pada rantai IFD file (setiap IFD adalah satu halaman); WMF yang tidak dapat diposisikan masih diidentifikasi dengan benar sebagai ImageFormat.Wmf tetapi hanya mengembalikan Format — dimensi hanya terisi untuk WMF yang dapat diposisikan, melalui konversi keras 96 DPI dari batas unit-per-inch pada header; EMF tidak memiliki bidang lebar/tinggi yang eksplisit sama sekali, sehingga dimensinya diambil dari persegi panjang ruang perangkat rclBounds sebagai gantinya.
Tangguh secara Desain
ImageProbe tidak pernah melemparkan kesalahan pada input yang rusak atau terpotong. Alih-alih mengeluarkan pengecualian, ia mengembalikan ImageInfo parsial — Format diatur setiap kali penanda format header dikenali, bahkan ketika sisa file terpotong atau korup:
byte[] truncated = fullFileBytes[..^3];
var info = ImageProbe.Probe(truncated);
// info.Format is still populated; other fields may be nullIni membuatnya aman dijalankan terhadap unduhan yang tidak terpercaya, parsial, atau sedang berlangsung tanpa try/catch di setiap pemanggilan.
Tips dan Praktik Terbaik
- Gunakan
DetectFormatalih-alihProbeketika Anda hanya membutuhkan format, bukan dimensi - Periksa
Width/Height/BitDepth/FrameCountuntuknullsebelum menggunakannya — mereka tidak diisi untuk setiap format - Lebih pilih
Probe(stream)daripada membaca seluruh file ke dalam array byte terlebih dahulu saat bekerja dengan file besar ImageProbesepenuhnya statis — tidak ada instance, tidak adaIDisposable, tidak ada objek konfigurasi
Masalah Umum
| Masalah | Penyebab | Perbaikan |
|---|---|---|
Format adalah ImageFormat.Unknown | Header tidak cocok dengan salah satu dari 11 format yang dikenali | Pastikan file tersebut merupakan salah satu dari PNG, JPEG, GIF, BMP, WebP, ICO, TIFF, PSD, EMF, WMF, atau DICOM |
Width/Height adalah null | Header format tidak memuat bidang itu, atau header terpotong sebelum bidang tersebut | Periksa Format terlebih dahulu; tidak setiap bidang terisi untuk setiap format |
| Tinggi BMP tampak secara tak terduga positif | File sumber menggunakan tinggi negatif (dari atas ke bawah) di headernya | Expected — ImageInfo.Height selalu menormalkan ke magnitudo positif |
FAQ
Apakah ImageProbe mendekode data piksel?
Tidak. Setiap metode hanya membaca header file — dimensi, kedalaman bit, dan jumlah frame — tidak pernah konten piksel. Dekode dan rendering berada di luar cakupan perpustakaan ini.
Apa yang terjadi jika saya memeriksa file yang rusak atau terpotong?
ImageProbe tidak pernah melempar pengecualian untuk masukan yang rusak atau terpotong. Ia mengembalikan sebuah ImageInfo dengan bidang apa pun yang dapat ditentukan dari byte header yang tersedia — Format diatur setiap kali penanda format itu sendiri dikenali.
Apakah saya dapat memeriksa stream yang tidak dapat di-seek?
Ya. Probe(stream) menerima stream yang dapat di-seek maupun yang tidak dapat di-seek.
API Reference Ringkasan
| Kelas / Metode | Deskripsi |
|---|---|
ImageProbe.ProbeFile(path) | Uji file berdasarkan jalur, mengembalikan sebuah ImageInfo |
ImageProbe.Probe(stream) | Uji Stream (seekable atau tidak) |
ImageProbe.Probe(data) | Uji byte[] mentah |
ImageProbe.DetectFormat(stream) | Kembalikan hanya ImageFormat untuk stream |
ImageProbe.DetectFormat(data) | Kembalikan hanya ImageFormat untuk byte[] |
ImageInfo | Tipe hasil: Format, Width, Height, BitDepth, FrameCount |
ImageFormat | Enum: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom |