คุณลักษณะและฟังก์ชันการทำงาน
คุณลักษณะและฟังก์ชันการทำงาน
หน้านี้ครอบคลุมทุกพื้นที่ฟีเจอร์ของ Aspose.Imaging FOSS สำหรับการตรวจจับรูปแบบของ .NET และการสำรวจส่วนหัวของ 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 ที่มี Width, Height, BitDepth, และ FrameCount ที่เป็นค่า nullable — แต่ละค่าจะถูกเติมเฉพาะเมื่อส่วนหัวของรูปแบบที่ตรวจพบจริง ๆ มีค่านั้น:
var info = ImageProbe.ProbeFile("scan.dcm");
if (info.Width.HasValue && info.Height.HasValue)
{
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}");
}Format (ค่าที่เป็น enum 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 คือหนึ่งหน้า); WMF ที่ไม่เป็นแบบ placeable ยังคงถูกระบุอย่างถูกต้องเป็น ImageFormat.Wmf แต่จะคืนค่าเฉพาะ Format — มิติจะถูกเติมเฉพาะสำหรับ WMF แบบ placeable เท่านั้น, ผ่านการแปลง 96 DPI ที่กำหนดค่าไว้จากขอบเขตหน่วยต่ออินช์ของส่วนหัว; 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 (seekable หรือไม่) |
ImageProbe.Probe(data) | สำรวจ byte[] ดิบ |
ImageProbe.DetectFormat(stream) | ส่งคืนเฉพาะ ImageFormat สำหรับสตรีม |
ImageProbe.DetectFormat(data) | คืนเฉพาะ ImageFormat สำหรับ byte[] |
ImageInfo | ประเภทผลลัพธ์: Format, Width, Height, BitDepth, FrameCount |
ImageFormat | Enum: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom |