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êm Unknown.
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 it

Tạ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

OverloadSử 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ânCá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ườngChỉ 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ạngSử 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ácXá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ứcMô 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 / .FrameCountCác thuộc tính kết quả chỉ đọc
ImageFormatEnum: Unknown, Png, Jpeg, Gif, Bmp, WebP, Ico, Tiff, Psd, Emf, Wmf, Dicom

Xem thêm

 Tiếng Việt