Як працювати з ресурсами зображень 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-збірці.