Wie man mit PSD-Bildressourcen in Python arbeitet
Ein geladenes PsdImage stellt seine Bildressourcenblöcke — metadatenähnliche Einträge wie Raster, Hilfslinien und ICC-Profil-Payloads — über zwei schreibgeschützte Ansichten bereit, zusätzlich zu einer separaten Zusammenfassung für indizierte Farbpaletten.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
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:$PYTHONPATHSchritt 2: Erforderliche Klassen importieren
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsSchritt 3: Bildressourcen prüfen und zählen
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Schritt 4: Ressourcenblöcke auflisten über image_resources
PsdImage.image_resources gibt ein PreservedResourceBlock pro Ressource zurück, mit der rohen Ressourcen-ID, dem Namen und der Byte-Größe:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Erkennen Sie eine bestimmte Ressource, indem Sie block.id mit den bekannten Konstanten in ImageResourceIds vergleichen:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")Der Ressourcenparser dieser FOSS-Version dekodiert Ressourc-IDs nicht in semantische Eigenschaften — das Vergleichen von block.id mit ImageResourceIds ist der unterstützte Weg, um eine bestimmte Ressource zu erkennen.
Schritt 5: Ressourcen-Zusammenfassungen auflisten über resources
PsdImage.resources gibt eine separate PsdResourceInfo-Zusammenfassung pro Ressource zurück, einschließlich einer kind-Klassifizierung:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")In dieser FOSS-Version ist kind immer PsdResourceKind.UNKNOWN — die semantische Klassifizierung spezifischer Ressourcentypen (globaler Winkel, ICC-Profil) ist nicht implementiert, daher behandeln Sie kind nur als informativ und verlassen sich auf resource_id (Schritt4), um eine bestimmte Ressource zu erkennen.
Schritt 6: Indizierte Farbpalette lesen
Wenn die Farbdaten des Dokuments palettenbasiert sind, gibt PsdImage.indexed_palette dessen Einträge zurück:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Häufige Probleme und Lösungen
image.indexed_palette is None. Der Farbdatentyp des Dokuments ist nicht INDEXED_PALETTE — nur indizierte Farbdokumente besitzen eine Palette.
Setting image.image_resources raises NotSupportedException. Der Getter funktioniert zum Auflisten von Ressourcen, aber der Setter wird in diesem FOSS-Build nicht unterstützt.
Calling block.save() auf einem PreservedResourceBlock raises NotImplementedError. Das direkte Speichern einzelner Ressourcenblöcke wird nicht unterstützt — Ressourcen werden automatisch round-trip, wenn Sie aufrufen image.save() auf das gesamte Dokument.
has_icc_profile, is_icc_profile_untagged, und global_angle ändern sich nie. Diese drei PsdImage Eigenschaften sind feste Platzhalterwerte in diesem FOSS-Build (has_icc_profile ist immer False, is_icc_profile_untagged ist immer None, global_angle ist immer 0) block.id Vergleich gegen ImageResourceIds wenn Sie diese Ressourcen selbst erkennen müssen.
Häufig gestellte Fragen
Was ist der Unterschied zwischen image_resources und resources?
Beide listen dieselben zugrunde liegenden Ressourcenblöcke auf, aber als unterschiedliche Objekttypen: image_resources gibt PreservedResourceBlock-Objekte zurück (rohe ID/Name/Größe, für Round-Trip verwendet), während resources PsdResourceInfo-Zusammenfassungen liefert (fügt eine kind-Klassifizierung hinzu, derzeit immer UNKNOWN).
Kann ich eine Bildressource ändern oder entfernen?
Nein — der Setter von image_resources löst NotSupportedException aus, und PreservedResourceBlock.save() löst NotImplementedError aus, wenn er direkt aufgerufen wird. Ressourcen sind in diesem FOSS-Build schreibgeschützt.