Comment travailler avec les ressources d'image PSD dans Python
Un PsdImage chargé expose ses blocs de ressources d’image — des entrées de type métadonnées telles que les grilles, les repères et les charges utiles de profil ICC — via deux vues en lecture seule, ainsi qu’un résumé séparé pour les palettes de couleurs indexées.
Guide étape par étape
Étape 1: installer le Package
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Étape 2: importer les classes requises
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsÉtape 3: vérifier et compter les ressources d’image
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Étape 4: Lister les blocs de ressources via image_resources
PsdImage.image_resources renvoie un PreservedResourceBlock par ressource, avec l’ID de ressource brut, le nom et la taille en octets:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Reconnaître une ressource spécifique en comparant block.id aux constantes connues dans ImageResourceIds:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")L’analyseur de ressources de cette version FOSS ne décode pas lui-même les ID de ressources en propriétés sémantiques — comparer block.id à ImageResourceIds vous-même est la méthode prise en charge pour reconnaître une ressource spécifique.
Étape 5: Lister les résumés de ressources via resources
PsdImage.resources renvoie un résumé PsdResourceInfo distinct par ressource, incluant une classification kind:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")Dans cette version FOSS, kind est toujours PsdResourceKind.UNKNOWN — la classification sémantique des types de ressources spécifiques (angle global, profil ICC) n’est pas implémentée, donc considérez kind comme purement informative et reposez-vous sur resource_id (Étape 4) pour reconnaître une ressource spécifique.
Étape 6: Lire une palette de couleurs indexée
Si les données de couleur du document sont basées sur une palette, PsdImage.indexed_palette renvoie ses entrées :
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Problèmes courants et solutions
image.indexed_palette is None. Le type de données couleur du document n’est pas INDEXED_PALETTE — seuls les documents à couleur indexée possèdent une palette.
Setting image.image_resources raises NotSupportedException. Le getter fonctionne pour lister les ressources, mais le setter n’est pas pris en charge dans cette version FOSS.
Calling block.save() sur un PreservedResourceBlock raises NotImplementedError. Enregistrer directement des blocs de ressources individuels n’est pas pris en charge — les ressources font un aller-retour automatiquement lorsque vous appelez image.save() sur le document entier.
has_icc_profile, is_icc_profile_untagged, et global_angle ne changent jamais. Ces trois PsdImage les propriétés sont des valeurs de substitution fixes dans cette version FOSS (has_icc_profile est toujours False, is_icc_profile_untagged est toujours None, global_angle est toujours 0) quel que soit le contenu réel du document chargé — le parseur de ressources de cette version ne reconstruit pas les valeurs sémantiques propres à l’ID. Utilisez la comparaison de l’étape 4 block.id comparaison avec ImageResourceIds si vous devez détecter ces ressources vous-même.
Foire aux questions
Quelle est la différence entre image_resources et resources ?
Les deux répertorient les mêmes blocs de ressources sous-jacent, mais sous différents types d’objets: image_resources renvoie des objets PreservedResourceBlock (ID/nom/taille bruts, utilisés pour le round-tripping), tandis que resources renvoie des résumés PsdResourceInfo (ajoute une classification kind, actuellement toujours UNKNOWN).
Puis-je modifier ou supprimer une ressource d’image?
Non — le setter de image_resources déclenche NotSupportedException, et PreservedResourceBlock.save() déclenche NotImplementedError s’il est appelé directement. Les ressources sont en lecture seule dans cette version FOSS.