วิธีทำงานกับ Aspose.Imaging FOSS Core API ใน .NET
Aspose.Imaging FOSS สำหรับ public surface ของ .NET ประกอบด้วยสามคลาส: ImageProbe, ImageInfo และ ImageFormat. คู่มือนี้จะอธิบายการติดตั้งแพคเกจและการใช้ทั้งสามร่วมกันเพื่อตรวจจับรูปแบบและอ่านเมตาดาทาเฮดเดอร์จากไฟล์, สตรีม, และอาร์เรย์ไบต์.
คู่มือแบบขั้นตอนต่อขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพคเกจ
git clone https://github.com/aspose-imaging-foss/Aspose.Imaging-FOSS-for-.NET.git
cd Aspose.Imaging-FOSS-for-.NET
dotnet buildแพคเกจนี้มุ่งเป้าไปที่ net8.0 และ netstandard2.0 และไม่มีการพึ่งพา runtime ภายนอกใด ๆ.
ขั้นตอนที่ 2: นำเข้า Namespace
เพิ่มคำสั่ง using เพียงหนึ่งรายการ — มันเปิดเผย ImageProbe, ImageInfo และ ImageFormat, พื้นผิวทั้งหมดของ API ดังนั้นจึงไม่มีสิ่งอื่นที่ต้องนำเข้า:
using Aspose.Imaging.Foss;ขั้นตอนที่ 3: ตรวจสอบไฟล์โดยใช้เส้นทาง
ImageProbe.ProbeFile อ่านส่วนหัวของไฟล์เท่าที่จำเป็นเพื่อเติมผลลัพธ์ ImageInfo — มันไม่เคยถอดรหัสข้อมูลพิกเซลเลย:
var info = ImageProbe.ProbeFile("photo.jpg");
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}, {info.BitDepth}-bit");ขั้นตอนที่ 4: ตรวจสอบสตรีมหรืออาเรย์ไบต์
เมื่อภาพอยู่ในหน่วยความจำแล้วหรือมาจากสตรีม (การอัปโหลด, การตอบสนองจากเครือข่าย) ให้ใช้ฟังก์ชันโอเวอร์โหลดที่รับค่าเหล่านั้นโดยตรงแทนการเขียนลงไฟล์ชั่วคราวก่อน:
byte[] bytes = File.ReadAllBytes("photo.jpg");
var infoFromBytes = ImageProbe.Probe(bytes);
using var stream = File.OpenRead("photo.jpg");
var infoFromStream = ImageProbe.Probe(stream);Probe(stream) ทำงานได้กับสตรีมที่สามารถเลื่อนได้และสตรีมที่ไม่สามารถเลื่อนได้.
ขั้นตอนที่ 5: ใช้ DetectFormat เมื่อคุณต้องการเพียงรูปแบบเท่านั้น
หากคุณต้องการแยกตามรูปแบบเท่านั้นและไม่ต้องการข้อมูลมิติ, ความลึกบิต หรือจำนวนเฟรม, DetectFormat จะข้ามการวิเคราะห์ส่วนหัวที่เหลือ:
var format = ImageProbe.DetectFormat(bytes);
if (format == ImageFormat.Dicom)
{
// route to DICOM-specific handling
}ขั้นตอนที่ 6: อ่านฟิลด์ ImageInfo ที่สามารถเป็นค่า null ได้อย่างปลอดภัย
Width, Height, BitDepth และ FrameCount สามารถเป็นค่า null ได้ — จะถูกเติมค่าเฉพาะเมื่อส่วนหัวของรูปแบบที่ตรวจพบจริง ๆ มีค่านั้น Format เป็นฟิลด์เดียวที่ถูกตั้งค่าตลอดเวลาเมื่อส่วนหัวได้รับการจดจำ:
var info = ImageProbe.ProbeFile("scan.dcm");
if (info.Width.HasValue && info.Height.HasValue)
{
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}");
}
else
{
Console.WriteLine($"{info.Format}: dimensions not available in this header");
}ปัญหาทั่วไปและวิธีแก้
รูปแบบแสดงเป็น ImageFormat.Unknown. ส่วนหัวของไฟล์ไม่ตรงกับรูปแบบที่รับรู้ 11 แบบใด (PNG, JPEG, GIF, BMP, WebP, ICO, TIFF, PSD, EMF, WMF, DICOM) ตรวจสอบว่าไฟล์เป็นหนึ่งในรูปแบบเหล่านั้นจริงหรือไม่ — ImageProbe ไม่เคยโยนข้อยกเว้นสำหรับส่วนหัวที่ไม่รู้จัก แต่จะรายงาน Unknown แทน.
Width/Height are null แม้ว่า Format ถูกตั้งค่า. ส่วนหัวของรูปแบบทุกแบบไม่ได้มีทุกฟิลด์เสมอไป และไฟล์ที่ถูกตัดขาดอาจหยุดก่อนไบต์ของฟิลด์ ตรวจสอบ Format เป็นอันดับแรก จากนั้นให้ถือส่วนที่เหลือว่าเป็นตัวเลือก.
Calling Probe when DetectFormat ก็ทำได้. Probe and ProbeFile วิเคราะห์ส่วนหัวทั้งหมด; DetectFormat อ่านเพียงพอเพื่อระบุรูปแบบเท่านั้น. ใช้ DetectFormat หากคุณไม่เคยอ่าน Width/Height/BitDepth/FrameCount.
คาดหวังข้อมูลพิกเซลที่ถอดรหัสแล้ว. ImageProbe ไม่เคยถอดรหัส, แสดงผล, หรือแปลงเนื้อหาภาพ — มันเพียงอ่านข้อมูลเมตาดาต้าส่วนหัวเท่านั้น การถอดรหัสและการดำเนินการระดับพิกเซลต้องใช้ SDK Aspose.Imaging แบบเชิงพาณิชย์.
คำถามที่พบบ่อย
จะเกิดอะไรขึ้นหากฉันตรวจสอบไฟล์ที่ถูกตัดหรือเสียหาย?
ImageProbe ไม่เคยโยนข้อยกเว้นเมื่ออินพุตผิดรูปหรือถูกตัดสั้น มันคืนค่า ImageInfo ส่วนหนึ่ง — Format จะถูกตั้งค่าเมื่อเครื่องหมายรูปแบบของส่วนหัวได้รับการจดจำ แม้ส่วนที่เหลือของไฟล์จะถูกตัดสั้นก็ตาม.
ImageProbe ปลอดภัยต่อการทำงานหลายเธรดหรือไม่?
ใช่. ImageProbe เป็นแบบสแตติกและไม่มีสถานะที่เปลี่ยนแปลงระหว่างการเรียกใช้งาน ดังนั้นการเรียกพร้อมกันจากหลายเธรดจึงปลอดภัย.
ฉันสามารถสร้าง ImageInfo ได้โดยตรงโดยไม่ต้องตรวจสอบไฟล์จริงหรือไม่?
ใช่. คอนสตรักเตอร์ของ ImageInfo เป็นสาธารณะและต้องการเฉพาะ format เท่านั้น — มีประโยชน์สำหรับการสร้าง test doubles: new ImageInfo(ImageFormat.Png, width: 64, height: 48).
ฉันต้องทำการ dispose อะไรหรือไม่?
เลขที่ ImageProbe ไม่มีทรัพยากร IDisposable ของตนเอง หากคุณส่งผ่าน Stream ที่คุณเปิดเอง คุณยังคงรับผิดชอบในการกำจัดมัน.