نحوه کار با منابع تصویر PSD در Python

نحوه کار با منابع تصویر PSD در Python

یک PsdImage بارگذاری‌شده بلوک‌های منابع تصویر خود را — ورودی‌های سبک متادیتا مانند شبکه‌ها، راهنماها و بارهای پروفایل ICC — از طریق دو نمای فقط-خواندنی، به‌علاوه خلاصه‌ای جداگانه برای پالته‌های رنگ ایندکس‌شده — نمایش می‌دهد.

راهنمای گام‌به‌گام

گام ۱: نصب بسته

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

گام ۲: وارد کردن کلاس‌های مورد نیاز

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

گام ۳: بررسی و شمارش منابع تصویر

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

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

مرحله ۴: فهرست‌کردن بلوک‌های منبع از طریق image_resources

PsdImage.image_resources برای هر منبع یک PreservedResourceBlock برمی‌گرداند که شامل شناسهٔ خام منبع، نام و اندازه به بایت است:

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

برای تشخیص یک منبع خاص، block.id را با ثابت‌های شناخته‌شده در ImageResourceIds مقایسه کنید:

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

پارسر منابع این نسخهٔ متن‌باز خود شناسه‌های منابع را به ویژگی‌های معنایی تبدیل نمی‌کند — مقایسهٔ block.id با ImageResourceIds به‌صورت دستی، روش پشتیبانی‌شده برای شناسایی یک منبع خاص است.


مرحله ۵: فهرست‌کردن خلاصه‌های منابع از طریق resources

PsdImage.resources برای هر منبع یک خلاصهٔ PsdResourceInfo جداگانه برمی‌گرداند که شامل یک طبقه‌بندی kind است:

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

در این نسخهٔ متن‌باز، kind همیشه PsdResourceKind.UNKNOWN است — طبقه‌بندی معنایی انواع خاص منابع (زاویهٔ جهانی، پروفایل ICC) پیاده‌سازی نشده، بنابراین kind را فقط به‌عنوان اطلاعاتی در نظر بگیرید و برای شناسایی یک منبع خاص به resource_id (مرحله ۴) متکی باشید.


مرحله ۶: خواندن یک پالت رنگ ایندکس‌شده

اگر داده‌های رنگی سند بر پایه پالت باشد، PsdImage.indexed_palette ورودی‌های آن را برمی‌گرداند:

palette = image.indexed_palette

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

مشکلات رایج و راه‌حل‌ها

image.indexed_palette is None. نوع داده رنگی سند نیست INDEXED_PALETTE — فقط اسناد رنگ نمایه‌ای یک پالت دارند.

Setting image.image_resources raises NotSupportedException. دست‌گیر (getter) برای فهرست کردن منابع کار می‌کند، اما تنظیم‌کننده (setter) در این نسخه منبع باز پشتیبانی نمی‌شود.

Calling block.save() روی یک PreservedResourceBlock raises NotImplementedError. ذخیره مستقیم بلوک‌های منبع جداگانه پشتیبانی نمی‌شود — منابع به‌صورت خودکار در زمان فراخوانی عبور می‌کنند image.save() روی کل سند.

has_icc_profile, is_icc_profile_untagged، و global_angle هرگز تغییر نمی‌کنند. این سه PsdImage ویژگی‌ها مقادیر جایگزین ثابت در این ساختار منبع باز (FOSS) هستند (has_icc_profile همیشه False, is_icc_profile_untagged همیشه None, global_angle همیشه 0) صرف‌نظر از محتوای واقعی سند بارگذاری‌شده — تجزیه‌گر منابع این ساختار مقادیر معنایی خاص شناسه را بازسازی نمی‌کند. از مقایسه گام ۴ استفاده کنید block.id مقایسه با ImageResourceIds اگر نیاز دارید این منابع را خودتان شناسایی کنید.

سؤالات متداول

فرق بین image_resources و resources چیست؟

هر دو بلوک‌های منبع زیرین یکسان را فهرست می‌کنند، اما به عنوان انواع شیء متفاوت: image_resources اشیای PreservedResourceBlock را بر می‌گرداند (شناسه/نام/اندازهٔ خام، برای دورگرد استفاده می‌شود)، در حالی که resources خلاصه‌های PsdResourceInfo را بر می‌گرداند (یک طبقه‌بندی kind اضافه می‌کند که در حال حاضر همیشه UNKNOWN است).

آیا می‌توانم یک منبع تصویر را تغییر دهم یا حذف کنم؟

خیر — تنظیم‌کنندهٔ image_resources NotSupportedException را ایجاد می‌کند، و PreservedResourceBlock.save() در صورت فراخوانی مستقیم NotImplementedError را ایجاد می‌کند. منابع در این ساختار FOSS فقط-خواندنی هستند.

همچنین ببینید:

 فارسی