Lõi API
API cốt lõi
Aspose.Imaging FOSS cho toàn bộ bề mặt công cộng của .NET bao gồm ba lớp: ImageProbe (giao diện tĩnh), ImageInfo (giá trị kết quả), và ImageFormat (enum định dạng). Trang này giải thích cách chúng phối hợp với nhau như một hợp đồng, vượt ra ngoài hướng dẫn tính năng trong Các tính năng và chức năng.
Hợp đồng ba lớp
ImageProbe— tĩnh, không trạng thái. Mỗi lời gọi là độc lập; không có gì cần cấu hình hay giải phóng.ImageInfo— bị niêm phong, bất biến. Tất cả năm thuộc tính (Format,Width,Height,BitDepth,FrameCount).ImageFormat— một enum với một giá trị cho mỗi định dạng được công nhận, cộng thêmUnknown.
using Aspose.Imaging.Foss;
var info = ImageProbe.ProbeFile("photo.jpg");
ImageFormat format = info.Format; // always set
int? width = info.Width; // set only when the format's header carries itTạo ImageInfo trực tiếp
Constructor của ImageInfo là công khai — chỉ format là bắt buộc, mọi tham số khác mặc định là null. Điều này hữu ích cho các bài kiểm thử đơn vị cần một kết quả thay thế mà không cần truy vấn một tệp thực tế:
using Aspose.Imaging.Foss;
// Fake a PNG result for a test double, with no dimensions
var fakeInfo = new ImageInfo(ImageFormat.Png);
// Fake a fully-populated result
var fullInfo = new ImageInfo(ImageFormat.Gif, width: 64, height: 48, bitDepth: 8, frameCount: 3);Không có cách nào tương ứng để mutate an ImageInfo sau khi khởi tạo — mọi thuộc tính đều chỉ đọc, vì vậy một thể hiện đã được thăm dò hoặc khởi tạo an toàn để truyền và lưu cache mà không cần sao chép phòng thủ.
Chọn overload phù hợp
| Overload | Sử dụng khi |
|---|---|
ImageProbe.ProbeFile(path) | Bạn có một đường dẫn tệp và muốn ImageInfo đầy đủ |
ImageProbe.Probe(stream) | Bạn đã có một Stream mở (có thể seek hoặc không) và muốn ImageInfo đầy đủ |
ImageProbe.Probe(data) | Bạn đã có các byte trong bộ nhớ và muốn ImageInfo đầy đủ |
ImageProbe.DetectFormat(stream) / (data) | Bạn chỉ cần nhánh dựa trên ImageFormat — bỏ qua việc phân tích tiêu đề vượt quá chữ ký định dạng |
ProbeFile tự mở và đọc tệp — không cần phải mở một FileStream trước chỉ để gọi Probe(stream).
Dò hàng loạt một thư mục
Vì ImageProbe không bao giờ ném ngoại lệ, một quá trình quét thư mục có thể gọi nó trong một vòng lặp chặt chẽ mà không cần try/catch cho từng tệp:
using Aspose.Imaging.Foss;
foreach (var path in Directory.GetFiles("incoming"))
{
var info = ImageProbe.ProbeFile(path);
if (info.Format == ImageFormat.Unknown)
{
Console.WriteLine($"{path}: not a recognized image format, skipping");
continue;
}
Console.WriteLine($"{path}: {info.Format} {info.Width}x{info.Height}");
}Bất kỳ tệp nào có tiêu đề không khớp với một trong 11 định dạng được công nhận sẽ chuyển về ImageFormat.Unknown thay vì ném ngoại lệ — vòng lặp trên không bao giờ cần khối catch.
Hợp đồng không ném ngoại lệ
Đây không phải là hành vi tình cờ — nó là một phần có chủ đích của hợp đồng API. Nếu tiêu đề của một định dạng được công nhận bị cắt ngắn hoặc sai dạng trong quá trình phân tích, ImageProbe vẫn trả về một ImageInfo với Format được đặt thành định dạng mà nó đã nhận ra; nó không truyền ngoại lệ phân tích cho người gọi. Chỉ có Format được đảm bảo — coi mọi thuộc tính khác là tùy chọn bất kể định dạng nào đã được phát hiện.
Các vấn đề thường gặp
| Vấn đề | Nguyên nhân | Cách khắc phục |
|---|---|---|
ImageInfo được xây dựng không khớp với kết quả probe thực tế | Các đối tượng được tạo thủ công không xác thực tính nhất quán giữa các trường | Chỉ sử dụng việc tạo thủ công cho các test double, không dùng như một sự thay thế cho việc thăm dò các tệp thực tế |
Gọi Probe khi DetectFormat đã đủ | Phân tích tiêu đề không cần thiết khi chỉ cần định dạng | Sử dụng DetectFormat nếu bạn không bao giờ đọc Width/Height/BitDepth/FrameCount |
Định dạng Unknown cho một tệp bạn mong đợi được hỗ trợ | Tiêu đề không khớp với bất kỳ trong 11 chữ ký được nhận dạng nào, hoặc tệp hoàn toàn là một định dạng khác | Xác nhận tệp so với danh sách các định dạng được hỗ trợ |
FAQ
Tôi có thể tạo lớp con từ ImageInfo hoặc ImageProbe không?
Không. ImageInfo là sealed và ImageProbe là static — cả hai đều không được thiết kế để tạo lớp con hoặc khởi tạo qua kế thừa.
Liệu ImageProbe có an toàn với đa luồng không?
ImageProbe không giữ trạng thái có thể thay đổi giữa các lần gọi — mỗi lần gọi đến Probe, ProbeFile hoặc DetectFormat là độc lập, khiến các cuộc gọi đồng thời từ nhiều luồng đều an toàn.
Tôi có cần giải phóng bất kỳ thứ gì không?
Không. ImageProbe không có 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 luồng đó — Probe(stream) không đóng nó.
API Reference Tóm tắt
| Lớp / Phương thức | Mô tả |
|---|---|
ImageProbe.ProbeFile(path) | Kiểm tra tệp theo đường dẫn |
ImageProbe.Probe(stream) | Kiểm tra Stream |
ImageProbe.Probe(data) | Kiểm tra byte[] |
ImageProbe.DetectFormat(stream) | Chỉ định dạng, từ một Stream |
ImageProbe.DetectFormat(data) | Chỉ định dạng, từ một byte[] |
ImageInfo(format, width, height, bitDepth, frameCount) | Constructor công khai — chỉ format là bắt buộc |
ImageInfo.Format / .Width / .Height / .BitDepth / .FrameCount | Các thuộc tính kết quả chỉ đọc |
ImageFormat | Enum: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom |