Cách làm việc với tài nguyên ảnh PSD trong Python

Cách làm việc với tài nguyên ảnh PSD trong Python

Một PsdImage đã tải lên sẽ hiển thị các khối tài nguyên hình ảnh — các mục kiểu siêu dữ liệu như lưới, hướng dẫn và dữ liệu hồ sơ ICC — thông qua hai chế độ xem chỉ đọc, cùng với một bản tóm tắt riêng cho các bảng màu chỉ mục.

Hướng dẫn từng bước

Bước 1: Cài đặt gói

git clone https://github.com/aspose-psd-foss/Aspose.PSD-FOSS-for-Python.git
cd Aspose.PSD-FOSS-for-Python
# No packaging manifest is published yet -- run from this folder,
# or add it to PYTHONPATH:
export PYTHONPATH=$PWD:$PYTHONPATH

Bước 2: Nhập các lớp cần thiết

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIds

Bước 3: Kiểm tra và đếm các tài nguyên hình ảnh

image = PsdImage.load("input.psd")

print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")

Bước 4: Liệt kê các khối tài nguyên qua image_resources

PsdImage.image_resources trả về một PreservedResourceBlock cho mỗi tài nguyên, kèm theo ID tài nguyên thô, tên và kích thước bằng byte:

for block in image.image_resources:
    print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")

Nhận dạng một tài nguyên cụ thể bằng cách so sánh block.id với các hằng số đã biết trong ImageResourceIds:

for block in image.image_resources:
    if block.id == ImageResourceIds.ICC_PROFILE:
        print(f"Found an ICC profile resource ({block.data_size} bytes)")

Bộ phân tích tài nguyên của bản dựng FOSS này không giải mã các ID tài nguyên thành các thuộc tính ngữ nghĩa — việc tự so sánh block.id với ImageResourceIds là cách được hỗ trợ để nhận dạng một tài nguyên cụ thể.


Bước 5: Liệt kê các tóm tắt tài nguyên qua resources

PsdImage.resources trả về một bản tóm tắt PsdResourceInfo riêng biệt cho mỗi tài nguyên, bao gồm một phân loại kind:

for info in image.resources:
    print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")

Trong bản dựng FOSS này, kind luôn luôn là PsdResourceKind.UNKNOWN — việc phân loại ngữ nghĩa các loại tài nguyên cụ thể (góc toàn cục, hồ sơ ICC) chưa được triển khai, vì vậy hãy coi kind chỉ là thông tin và dựa vào resource_id (Bước 4) để nhận dạng một tài nguyên cụ thể.


Bước 6: Đọc bảng màu đã lập chỉ mục

Nếu dữ liệu màu của tài liệu dựa trên bảng màu, PsdImage.indexed_palette trả về các mục của nó:

palette = image.indexed_palette

if palette is not None:
    print(f"Palette entries: {len(palette.entries)}")

Các vấn đề thường gặp và cách khắc phục

image.indexed_palette is None. Loại dữ liệu màu của tài liệu không phải là INDEXED_PALETTE — chỉ các tài liệu màu được lập chỉ mục mới có bảng màu.

Setting image.image_resources raises NotSupportedException. Phương thức getter hoạt động để liệt kê các tài nguyên, nhưng setter không được hỗ trợ trong bản dựng FOSS này.

Calling block.save() trên một PreservedResourceBlock raises NotImplementedError. Lưu các khối tài nguyên riêng lẻ trực tiếp không được hỗ trợ — các tài nguyên sẽ tự động vòng qua khi bạn gọi image.save() trên toàn bộ tài liệu.

has_icc_profile, is_icc_profile_untagged, và global_angle không bao giờ thay đổi. Ba mục này PsdImage các thuộc tính là các giá trị chỗ giữ cố định trong bản xây dựng FOSS này (has_icc_profile luôn luôn False, is_icc_profile_untagged luôn luôn None, global_angle luôn luôn 0) bất kể nội dung thực tế của tài liệu đã tải — trình phân tích tài nguyên của bản dựng này không tái tạo các giá trị ngữ nghĩa đặc thù cho ID. Sử dụng của Bước 4 block.id so sánh với ImageResourceIds nếu bạn cần tự phát hiện các tài nguyên này.

Câu hỏi thường gặp

Sự khác biệt giữa image_resources và resources là gì?

Cả hai đều liệt kê các khối tài nguyên nền tảng giống nhau, nhưng dưới dạng các loại đối tượng khác nhau: image_resources trả về các đối tượng PreservedResourceBlock (ID/tên/kích thước thô, dùng cho vòng tròn), trong khi resources trả về các bản tóm tắt PsdResourceInfo (thêm một phân loại kind, hiện tại luôn là UNKNOWN).

Tôi có thể sửa đổi hoặc xóa một tài nguyên hình ảnh không?

Không — bộ thiết lập image_resources gây ra NotSupportedException, và PreservedResourceBlock.save() gây ra NotImplementedError nếu được gọi trực tiếp. Các tài nguyên chỉ đọc trong bản xây dựng FOSS này.

Xem thêm

 Tiếng Việt