Как работать с 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-версии.