Come lavorare con le risorse immagine PSD in Python
Un PsdImage caricato espone i suoi blocchi di risorse immagine — voci in stile metadati come griglie, guide e payload dei profili ICC — tramite due visualizzazioni in sola lettura, oltre a un riepilogo separato per le palette di colori indicizzate.
Guida passo-passo
Passo 1: Installa il pacchetto
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: Importa le classi necessarie
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsPasso 3: Verifica e conta le risorse immagine
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Passo 4: Elenca i blocchi di risorse tramite image_resources
PsdImage.image_resources restituisce un PreservedResourceBlock per risorsa, con l’ID grezzo della risorsa, il nome e la dimensione in byte:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Riconosci una risorsa specifica confrontando block.id con le costanti note in ImageResourceIds:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")Il parser di risorse di questa build FOSS non decodifica gli ID delle risorse in proprietà semantiche da solo — confrontare block.id con ImageResourceIds autonomamente è il modo supportato per riconoscere una risorsa specifica.
Passo 5: Elenca i riepiloghi delle risorse tramite resources
PsdImage.resources restituisce un riepilogo PsdResourceInfo separato per risorsa, includendo una classificazione kind:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")In questa build FOSS, kind è sempre PsdResourceKind.UNKNOWN — la classificazione semantica di tipi specifici di risorse (angolo globale, profilo ICC) non è implementata, quindi considera kind solo a scopo informativo e fai affidamento su resource_id (Passo 4) per riconoscere una risorsa specifica.
Passo 6: Leggi una tavolozza di colori indicizzata
Se i dati colore del documento sono basati su palette, PsdImage.indexed_palette restituisce le sue voci:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Problemi comuni e soluzioni
image.indexed_palette is None. Il tipo di dati colore del documento non è INDEXED_PALETTE — solo i documenti a colori indicizzati hanno una tavolozza.
Setting image.image_resources raises NotSupportedException. Il getter funziona per elencare le risorse, ma il setter non è supportato in questa build FOSS.
Calling block.save() su un PreservedResourceBlock raises NotImplementedError. Il salvataggio diretto di blocchi di risorse individuali non è supportato — le risorse effettuano il round-trip automaticamente quando chiami image.save() sull’intero documento.
has_icc_profile, is_icc_profile_untagged, e global_angle non cambiano mai. Questi tre PsdImage le proprietà sono valori segnaposto fissi in questa build FOSS (has_icc_profile è sempre False, is_icc_profile_untagged è sempre None, global_angle è sempre 0) indipendentemente dal contenuto effettivo del documento caricato — il parser delle risorse di questa build non ricostruisce valori semantici specifici per ID. Usa Step 4’s block.id confronto con ImageResourceIds se hai bisogno di rilevare queste risorse autonomamente.
Domande frequenti
Qual è la differenza tra image_resources e resources?
Entrambi elencano gli stessi blocchi di risorse sottostanti, ma come tipi di oggetto diversi: image_resources restituisce oggetti PreservedResourceBlock (ID/nome/taglia grezzi, usati per il round-tripping), mentre resources restituisce riepiloghi PsdResourceInfo (aggiunge una classificazione kind, attualmente sempre UNKNOWN).
Posso modificare o rimuovere una risorsa immagine?
No — il setter di image_resources genera NotSupportedException, e PreservedResourceBlock.save() genera NotImplementedError se chiamato direttamente. Le risorse sono in sola lettura in questa build FOSS.