คุณลักษณะและฟังก์ชันการทำงาน

คุณลักษณะและฟังก์ชันการทำงาน

คุณลักษณะและฟังก์ชันการทำงาน

หน้านี้ครอบคลุมทุกพื้นที่ฟีเจอร์ของ 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
GIFFrameCount แสดงจำนวนเฟรมเมื่อไฟล์มีหลายเฟรม; จะถูกละเว้นหากไม่สามารถกำหนดจำนวนได้
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
ImageFormatEnum: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom

ดูเพิ่มเติม

 ภาษาไทย