Como trabalhar com recursos de imagem PSD em Python
Um PsdImage carregado expõe seus blocos de recursos de imagem — entradas no estilo de metadados, como grades, guias e cargas úteis de perfil ICC — através de duas visualizações somente leitura, além de um resumo separado para paletas de cores indexadas.
Guia passo a passo
Passo 1: Instale 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:$PYTHONPATHPasso 2: Importe as classes necessárias
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsPasso 3: Verifique e conte os recursos de imagem
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Etapa 4: Listar blocos de recurso via image_resources
PsdImage.image_resources devolve um PreservedResourceBlock por recurso, com o ID bruto do recurso, nome e tamanho em bytes:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Reconheça um recurso específico comparando block.id com as constantes conhecidas em ImageResourceIds:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")O analisador de recursos desta compilação FOSS não decodifica IDs de recurso em propriedades semânticas — comparar block.id com ImageResourceIds você mesmo é a forma suportada de reconhecer um recurso específico.
Etapa 5: Listar resumos de recurso via resources
PsdImage.resources devolve um resumo PsdResourceInfo separado por recurso, incluindo uma classificação kind:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")Nesta compilação FOSS, kind está sempre PsdResourceKind.UNKNOWN — a classificação semântica de tipos específicos de recurso (ângulo global, perfil ICC) não está implementada, portanto trate kind apenas como informativa e baseie-se em resource_id (Etapa 4) para reconhecer um recurso específico.
Etapa 6: Ler uma paleta de cores indexada
Se os dados de cor do documento forem baseados em paleta, PsdImage.indexed_palette retorna suas entradas:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Problemas Comuns e Soluções
image.indexed_palette is None. O tipo de dados de cor do documento não é INDEXED_PALETTE — apenas documentos com cores indexadas carregam uma paleta.
Setting image.image_resources raises NotSupportedException. O getter funciona para listar recursos, mas o setter não é suportado nesta compilação FOSS.
Calling block.save() em um PreservedResourceBlock raises NotImplementedError. Salvar blocos de recursos individuais diretamente não é suportado — os recursos são processados automaticamente quando você chama image.save() no documento inteiro.
has_icc_profile, is_icc_profile_untagged, e global_angle nunca mudam. Estes três PsdImage as propriedades são valores de placeholder fixos nesta compilação FOSS (has_icc_profile é sempre False, is_icc_profile_untagged é sempre None, global_angle é sempre 0) independentemente do conteúdo real do documento carregado — este analisador de recursos da compilação não reconstrói valores semânticos específicos de ID. Use o Step 4’s block.id comparação contra ImageResourceIds se precisar detectar esses recursos por conta própria.
Perguntas Frequentes
Qual é a diferença entre image_resources e resources?
Ambos listam os mesmos blocos de recursos subjacentes, mas como tipos de objeto diferentes: image_resources retorna objetos PreservedResourceBlock (ID/nome/tamanho bruto, usado para round-tripping), enquanto resources retorna resumos PsdResourceInfo (adiciona uma classificação kind, atualmente sempre UNKNOWN).
Posso modificar ou remover um recurso de imagem?
Não — o setter de image_resources levanta NotSupportedException, e PreservedResourceBlock.save() levanta NotImplementedError se chamado diretamente. Os recursos são somente leitura nesta compilação FOSS.