Como trabalhar com camadas PSD em Python
Este guia mostra como listar as camadas de um documento, ler e alterar os metadados editáveis das camadas, reposicionar uma camada e remover uma camada da coleção. A propriedade layers de um PsdImage carregado retorna sua coleção de objetos Layer. Cada Layer expõe metadados editáveis — nome, visibilidade, opacidade, recorte, modo de mesclagem e posição (bordas dos limites) — além de limites gerais e informações de canal somente leitura.
Guia passo a passo
Etapa 1: Instalar o pacote
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:$PYTHONPATHEtapa 2: Importar as classes necessárias
PsdImage carrega o documento; BlendMode é usado posteriormente para definir o modo de mesclagem de uma camada:
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.layers.blendmode import BlendModeEtapa 3: Carregar um Documento e Listar Suas Camadas
Carregue o documento, então itere layers para ver o nome e a geometria de cada camada:
image = PsdImage.load("input.psd")
for layer in image.layers:
print(f"{layer.name}: {layer.width}x{layer.height} at ({layer.left},{layer.top})")Etapa 4: Ler e Editar a Visibilidade, Opacidade e Modo de Mesclagem da Camada
is_visible, opacity (convenionalmente 0-255), clipping, name e blend_mode_key todos possuem setters funcionais:
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"Etapa 5: Ler e Reposicionar os Limites da Camada
bounds, width, height e channels_count são somente leitura — mas top, left, bottom e right cada um tem um setter funcional que reposiciona a camada:
print(f"Bounds: {layer.bounds}")
print(f"Channels: {layer.channels_count}")
layer.left = 10
layer.top = 20
layer.right = 40
layer.bottom = 60Etapa 6: Substituir a Coleção de Camadas
PsdImage.layers em si tem um setter funcional, então você pode substituir toda a coleção (por exemplo, para remover uma camada):
image.layers = [l for l in image.layers if l.name != "Renamed Layer"]Etapa 7: Salvar o Documento
Persista todas as edições feitas nas etapas anteriores de volta ao disco, depois libere os recursos da imagem:
image.save("output.psd")
image.dispose()Problemas Comuns e Correções
NotSupportedException ao definir channel_information, layer_mask_data, ou layer_blending_ranges_data. Estes três Layer os setters não são suportados nesta compilação FOSS — trate-os como somente leitura.
O valor da opacidade parece incorreto após defini-lo. opacity é convencionalmente um valor de 0-255, não uma fração de 0,0-1,0 ou uma porcentagem — layer.opacity = 200 significa aproximadamente 78% opaco (200/255).
As alterações em uma camada não aparecem após salvar. Confirme que está modificando o Layer instância obtida de image.layers, e que você chame image.save() depois de fazer suas edições.
Perguntas Frequentes
Posso remover uma camada de um documento?
Sim — PsdImage.layers tem um setter funcional, então você pode atribuir a ele uma lista filtrada para remover camadas (veja a Etapa 6).
Quais modos de mesclagem estão disponíveis?
BlendMode inclui valores como NORMAL, MULTIPLY, SCREEN, OVERLAY e DARKEN, entre outros — configurado via Layer.blend_mode_key.
Os dados da máscara de camada estão disponíveis?
Layer.layer_mask_data tem um getter funcional, mas seu setter gera NotSupportedException nesta compilação FOSS.