Як працювати з ресурсами зображень PSD у Python

Як працювати з ресурсами зображень PSD у Python

Завантажений PsdImage відкриває свої блоки ресурсів зображень — записи у стилі метаданих, такі як сітки, напрямні та дані профілю ICC — через два лише для читання перегляди, а також окремий підсумок для індексованих кольорових палітр.

Покроковий посібник

Крок 1: Встановити пакет

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

Крок 2: Імпорт необхідних класів

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

Крок 3: Перевірити та підрахувати ресурси зображень

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

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

Крок 4: Список блоків ресурсів через 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)")

Парсер ресурсів у цій FOSS-збірці не розкодує ідентифікатори ресурсів у семантичні властивості — порівняння block.id з ImageResourceIds вручну є підтримуваним способом розпізнати конкретний ресурс.


Крок 5: Список підсумків ресурсів через resources

PsdImage.resources повертає окремий PsdResourceInfo підсумок для кожного ресурсу, включаючи класифікацію kind:

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

У цій FOSS-збірці kind завжди PsdResourceKind.UNKNOWN — семантична класифікація конкретних типів ресурсів (глобальний кут, ICC-профіль) не реалізована, тому розглядайте kind лише як інформаційну та покладайтеся на resource_id (Крок 4) для розпізнавання конкретного ресурсу.


Крок 6: Зчитати індексовану кольорову палітру

Якщо колірні дані документа базуються на палітрі, 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. Метод отримання працює для перерахування ресурсів, але метод встановлення не підтримується у цій FOSS-версії.

Calling block.save() на PreservedResourceBlock raises NotImplementedError. Збереження окремих блоків ресурсів безпосередньо не підтримується — ресурси автоматично проходять round-trip, коли ви викликаєте 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) незалежно від фактичного вмісту завантаженого документа — парсер ресурсів цього збірки не відтворює семантичні значення, специфічні для ID. Використайте порівняння кроку 4 block.id порівняння з ImageResourceIds якщо вам потрібно виявити ці ресурси самостійно.

Поширені запитання

У чому різниця між image_resources і resources?

Обидва перераховують однакові базові блоки ресурсів, але як різні типи об’єктів: image_resources повертає об’єкти PreservedResourceBlock (необроблені ID/ім’я/розмір, використовуються для кругового проходу), тоді як resources повертає підсумки PsdResourceInfo (додає класифікацію kind, наразі завжди UNKNOWN).

Чи можу я змінити або видалити ресурс зображення?

Ні — сеттер image_resources викликає NotSupportedException, а PreservedResourceBlock.save() викликає NotImplementedError, якщо його викликати безпосередньо. Ресурси лише для читання у цьому FOSS-збірці.

Дивіться також

 Українська