Como trabalhar com recursos de imagem PSD em Python

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:$PYTHONPATH

Passo 2: Importe as classes necessárias

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIds

Passo 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.

Ver também

 Português