Как работать с PSD-слоями в Python

Как работать с PSD-слоями в Python

Это руководство показывает, как перечислить слои документа, читать и изменять редактируемые метаданные слоя, перемещать слой и удалять слой из коллекции. Свойство layers загруженного PsdImage возвращает его коллекцию объектов Layer. Каждый Layer предоставляет редактируемые метаданные — имя, видимость, непрозрачность, обрезка, режим наложения и позицию (границы), — а также только для чтения общие границы и информацию о каналах.

Пошаговое руководство

Шаг 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: Импортируйте необходимые классы

PsdImage загружает документ; BlendMode используется позже для установки режима наложения слоя:

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.layers.blendmode import BlendMode

Шаг 3: Загрузить документ и перечислить его слои

Загрузите документ, затем пройдитесь по layers, чтобы увидеть имя и геометрию каждого слоя:

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

for layer in image.layers:
    print(f"{layer.name}: {layer.width}x{layer.height} at ({layer.left},{layer.top})")

Шаг 4: Читать и изменять видимость слоя, непрозрачность и режим наложения

is_visible, opacity (обычно 0-255), clipping, name и blend_mode_key все имеют работающие сеттеры:

layer = image.layers[0]

layer.is_visible = False          # hide the layer
layer.opacity = 200               # ~78% opacity
layer.blend_mode_key = BlendMode.MULTIPLY
layer.name = "Renamed Layer"

Шаг 5: Читать и перемещать границы слоя

bounds, width, height и channels_count доступны только для чтения — но top, left, bottom и right каждый имеют работающий сеттер, который перемещает слой:

print(f"Bounds: {layer.bounds}")
print(f"Channels: {layer.channels_count}")

layer.left = 10
layer.top = 20
layer.right = 40
layer.bottom = 60

Шаг 6: Заменить коллекцию слоёв

PsdImage.layers сам имеет работающий сеттер, поэтому вы можете заменить всю коллекцию (например, чтобы удалить слой):

image.layers = [l for l in image.layers if l.name != "Renamed Layer"]

Шаг7: Сохранить документ

Сохраните все изменения, сделанные на предыдущих шагах, на диск, затем освободите ресурсы изображения:

image.save("output.psd")
image.dispose()

Общие проблемы и исправления

NotSupportedException при установке channel_information, layer_mask_data, или layer_blending_ranges_data. Эти три Layer установщики не поддерживаются в этой FOSS-сборке — рассматривайте их как только для чтения.

Значение непрозрачности выглядит неверным после его установки. opacity обычно представляет собой значение от 0 до 255, не дробь 0.0-1.0 или процент — layer.opacity = 200 означает примерно 78% непрозрачности (200/255).

Изменения слоя не отображаются после сохранения. Подтвердите, что вы модифицируете Layer экземпляр, полученный из image.layers, и что вы вызываете image.save() после внесения ваших правок.

Часто задаваемые вопросы

Могу ли я удалить слой из документа?

Да — PsdImage.layers имеет рабочий сеттер, поэтому вы можете присвоить ему отфильтрованный список для удаления слоёв (см. Шаг 6).

Какие режимы наложения доступны?

BlendMode включает значения, такие как NORMAL, MULTIPLY, SCREEN, OVERLAY и DARKEN, среди прочих — задаётся через Layer.blend_mode_key.

Доступны ли данные маски слоя?

Layer.layer_mask_data имеет рабочий геттер, но его сеттер вызывает NotSupportedException в этой FOSS-версии.

См. также:

 Русский