Cách làm việc với Aspose.Imaging FOSS Core API trong .NET
Aspose.Imaging FOSS cho bề mặt công cộng của .NET gồm ba lớp: ImageProbe, ImageInfo, và ImageFormat. Hướng dẫn này sẽ đi qua quá trình cài đặt gói và sử dụng cả ba cùng nhau để phát hiện định dạng và đọc siêu dữ liệu tiêu đề từ tệp, luồng và mảng byte.
Hướng dẫn từng bước
Bước 1: Cài đặt gói
git clone https://github.com/aspose-imaging-foss/Aspose.Imaging-FOSS-for-.NET.git
cd Aspose.Imaging-FOSS-for-.NET
dotnet buildGói này nhắm tới net8.0 và netstandard2.0 và không có phụ thuộc thời gian chạy bên ngoài.
Bước 2: Nhập không gian tên
Thêm một chỉ thị using duy nhất — nó sẽ hiển thị ImageProbe, ImageInfo, và ImageFormat, toàn bộ bề mặt API, vì vậy không còn gì khác để nhập:
using Aspose.Imaging.Foss;Bước 3: Kiểm tra tệp theo Đường dẫn
ImageProbe.ProbeFile chỉ đọc đủ phần đầu của tệp để tạo kết quả ImageInfo — nó không bao giờ giải mã dữ liệu pixel:
var info = ImageProbe.ProbeFile("photo.jpg");
Console.WriteLine($"{info.Format}: {info.Width}x{info.Height}, {info.BitDepth}-bit");Bước 4: Kiểm tra Luồng hoặc Mảng Byte
Khi hình ảnh đã có trong bộ nhớ hoặc đến từ một luồng (tải lên, phản hồi mạng), hãy sử dụng các hàm quá tải chấp nhận chúng trực tiếp thay vì ghi vào tệp tạm thời trước tiên:
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) hoạt động với cả luồng có thể di chuyển và luồng không thể di chuyển.
Bước 5: Sử dụng DetectFormat Khi Bạn Chỉ Cần Định Dạng
Nếu bạn chỉ cần quyết định dựa trên định dạng và không cần kích thước, độ sâu bit, hoặc số khung, DetectFormat sẽ bỏ qua phần còn lại của việc phân tích tiêu đề:
var format = ImageProbe.DetectFormat(bytes);
if (format == ImageFormat.Dicom)
{
// route to DICOM-specific handling
}Bước 6: Đọc các Trường ImageInfo Có Thể Null Một Cách An Toàn
Width, Height, BitDepth, và FrameCount có thể null — chúng chỉ được điền khi tiêu đề của định dạng được phát hiện thực sự chứa giá trị đó. Format là trường duy nhất luôn được thiết lập một khi tiêu đề được nhận dạng:
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");
}Các Vấn Đề Thường Gặp và Cách Khắc Phục
Định dạng hiển thị là ImageFormat.Unknown. Tiêu đề của tệp không khớp với bất kỳ 11 định dạng được công nhận nào (PNG, JPEG, GIF, BMP, WebP, ICO, TIFF, PSD, EMF, WMF, DICOM). Xác nhận rằng tệp thực sự là một trong các định dạng đó — ImageProbe không bao giờ ném lỗi cho tiêu đề không được nhận dạng, nó báo cáo Unknown thay vào đó.
Width/Height are null mặc dù Format được đặt. Không phải mọi tiêu đề của định dạng đều chứa mọi trường, và tệp bị cắt ngắn có thể bị dừng lại trước các byte của một trường. Kiểm tra Format đầu tiên, sau đó xem phần còn lại là tùy chọn.
Calling Probe when DetectFormat sẽ làm. Probe and ProbeFile phân tích toàn bộ tiêu đề; DetectFormat chỉ đọc đủ để xác định định dạng. Sử dụng DetectFormat nếu bạn không bao giờ đọc Width/Height/BitDepth/FrameCount.
Đang mong đợi dữ liệu pixel đã giải mã. ImageProbe không bao giờ giải mã, render, hoặc chuyển đổi nội dung hình ảnh — nó chỉ đọc siêu dữ liệu tiêu đề. Việc giải mã và các thao tác ở mức pixel đòi hỏi SDK thương mại Aspose.Imaging.
Câu hỏi thường gặp
Điều gì sẽ xảy ra nếu tôi kiểm tra một tệp bị cắt ngắn hoặc hỏng?
ImageProbe không bao giờ ném ngoại lệ khi đầu vào bị sai định dạng hoặc bị cắt ngắn. Nó trả về một ImageInfo một phần — Format được đặt mỗi khi dấu hiệu định dạng của tiêu đề được nhận ra, ngay cả khi phần còn lại của tệp bị cắt ngắn.
Liệu ImageProbe có an toàn với đa luồng không?
Có. ImageProbe là tĩnh và không giữ trạng thái có thể thay đổi giữa các lần gọi, vì vậy các cuộc gọi đồng thời từ nhiều luồng đều an toàn.
Tôi có thể tạo một ImageInfo trực tiếp mà không cần probe một tệp thực không?
Có. Hàm tạo của ImageInfo là công khai và chỉ yêu cầu format — hữu ích cho việc xây dựng các đối tượng test double: new ImageInfo(ImageFormat.Png, width: 64, height: 48).
Tôi có cần giải phóng bất kỳ thứ gì không?
No. ImageProbe không chứa bất kỳ tài nguyên IDisposable nào của riêng nó. Nếu bạn truyền một Stream mà bạn tự mở, bạn vẫn chịu trách nhiệm giải phóng nó.