Como Inspecionar Seções de Documento PSD em Python
Um PsdImage carregado expõe objetos de resumo somente leitura para as seções estruturais de um documento PSD/PSB — o cabeçalho, a seção de dados de cor, a seção de dados de imagem e a seção de recursos de imagem — sem exigir qualquer análise manual ao nível de bytes.
Guia Passo a Passo
Passo 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:$PYTHONPATHPasso 2: Importar as Classes Necessárias
from aspose_psd_foss.psdimage import PsdImagePasso 3: Inspecionar a Seção de Cabeçalho
PsdImage.header retorna um PsdHeader com os campos estruturais brutos do documento:
image = PsdImage.load("input.psd")
header = image.header
print(f"Size: {header.width}x{header.height}, channels: {header.channels}")
print(f"Bit depth: {header.bit_depth}, raw color mode: {header.color_mode}")
print(f"Is PSB: {header.is_large_document}")PsdHeader.color_mode retorna o campo bruto do modo de cor inteiro como armazenado no arquivo — use PsdImage.color_mode em vez disso se precisar do enum fortemente tipado ColorModes.
Etapa 4: Inspecionar a Seção de Dados de Cor
PsdImage.color_data_info retorna um resumo PsdColorDataInfo; kind é um valor PsdColorDataKind (NONE, INDEXED_PALETTE, RGB_PAYLOAD, CMYK_PAYLOAD ou RAW_PRESERVED):
if image.has_color_mode_data:
color_info = image.color_data_info
print(f"Color data kind: {color_info.kind}, raw bytes: {color_info.raw_data_length}")
if color_info.indexed_palette is not None:
print(f"Indexed palette entries: {len(color_info.indexed_palette.entries)}")Etapa 5: Inspecionar a Seção de Dados da Imagem
PsdImage.image_data_info retorna um resumo PsdImageDataInfo descrevendo como os dados de pixel mesclados são codificados:
data_info = image.image_data_info
print(f"Compression: {image.compression}")
print(f"Data kind: {data_info.kind}, uses prediction: {data_info.uses_prediction}")
print(f"Compressed payload length: {data_info.compressed_payload_length}")data_info.kind é um valor ImageDataKind (RAW, RLE, ZIP ou UNKNOWN) que descreve a própria codificação dos dados de imagem mesclados — image.compression relata a mesma codificação através do enum CompressionMethod separado.
Etapa 6: Inspecionar a Seção de Recursos da Imagem
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")
for resource in image.resources:
print(f"Resource ID: {resource.resource_id}, kind: {resource.kind}")PsdImage.resources retorna somente leitura PsdResourceInfo resumos. O separado PsdImage.image_resources propriedade também tem um getter, mas seu setter lança NotSupportedException nesta compilação FOSS — veja Troubleshooting para a lista completa de setters somente leitura.
Problemas Comuns e Soluções
header.color_mode não corresponde image.color_mode. Isso é esperado — PsdHeader.color_mode é o campo inteiro bruto do arquivo, enquanto PsdImage.color_mode é o tipado fortemente ColorModes enum construído a partir dele.
color_data_info.indexed_palette is None. O tipo de dados de cor do documento não é INDEXED_PALETTE — apenas documentos de cor indexada carregam uma paleta.
Setting image.image_resources raises NotSupportedException. Este setter não é suportado nesta compilação FOSS; trate image_resources and resources como somente leitura.
Perguntas Frequentes
Posso modificar as seções de cabeçalho, dados de cor ou dados de imagem diretamente?
Não — PsdHeader, PsdColorDataInfo, ColorData e PsdImageDataInfo são todos objetos de resumo somente leitura nesta compilação FOSS. Não há setters públicos em nenhuma de suas propriedades.
Qual é a diferença entre image.compression e image.image_data_kind?
Eles descrevem a mesma codificação subjacente por meio de dois enums separados: image.compression retorna um valor CompressionMethod, enquanto image.image_data_info.kind retorna um valor ImageDataKind.