Hoe te werken met PSD-afbeeldingsresources in Python
Een geladen PsdImage exposeert zijn afbeeldingsresourceblokken — metadata-achtige items zoals rasters, hulplijnen en ICC-profielpayloads — via twee alleen-lezen weergaven, plus een aparte samenvatting voor geïndexeerde kleurenpaletten.
Stapsgewijze handleiding
Stap 1: Installeer het pakket
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:$PYTHONPATHStap 2: Importeer de vereiste klassen
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsStap 3: Controleer en tel afbeeldingsbronnen
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Stap 4: Lijst resourceblokken via image_resources
PsdImage.image_resources retourneert een PreservedResourceBlock per resource, met de ruwe resource-ID, naam en bytegrootte:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Herken een specifieke resource door block.id te vergelijken met de bekende constanten 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)")De resource-parser van deze FOSS-build decodeert resource-ID’s niet naar semantische eigenschappen — het zelf vergelijken van block.id met ImageResourceIds is de ondersteunde manier om een specifieke resource te herkennen.
Stap 5: Lijst resourcesamenvattingen via resources
PsdImage.resources retourneert een aparte PsdResourceInfo samenvatting per resource, inclusief een kind classificatie:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")In deze FOSS-build is kind altijd PsdResourceKind.UNKNOWN — semantische classificatie van specifieke resource-soorten (globale hoek, ICC-profiel) is niet geïmplementeerd, dus beschouw kind alleen als informatief en vertrouw op resource_id (Stap 4) om een specifieke resource te herkennen.
Stap 6: Lees een geïndexeerd kleurenpalet
Als de kleurgegevens van het document paletgebaseerd zijn, retourneert PsdImage.indexed_palette de bijbehorende items:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Veelvoorkomende problemen en oplossingen
image.indexed_palette is None. Het type kleurgegevens van het document is niet INDEXED_PALETTE — alleen geïndexeerde-kleurdocumenten hebben een palet.
Setting image.image_resources raises NotSupportedException. De getter werkt voor het opsommen van resources, maar de setter wordt niet ondersteund in deze FOSS-build.
Calling block.save() op een PreservedResourceBlock raises NotImplementedError. Het direct opslaan van individuele resourceblokken wordt niet ondersteund — resources maken automatisch een round-trip wanneer je aanroept image.save() op het volledige document.
has_icc_profile, is_icc_profile_untagged, en global_angle nooit veranderen. Deze drie PsdImage eigenschappen zijn vaste placeholder-waarden in deze FOSS-build (has_icc_profile is altijd False, is_icc_profile_untagged is altijd None, global_angle is altijd 0) ongeacht de feitelijke inhoud van het geladen document — de resourceparser van deze build reconstructeert geen ID-specifieke semantische waarden. Gebruik Step 4’s block.id vergelijking met ImageResourceIds als je deze bronnen zelf moet detecteren.
Veelgestelde vragen
Wat is het verschil tussen image_resources en resources?
Beiden geven dezelfde onderliggende resource-blokken weer, maar als verschillende objecttypen: image_resources retourneert PreservedResourceBlock objecten (ruwe ID/naam/grootte, gebruikt voor round-tripping), terwijl resources PsdResourceInfo samenvattingen retourneert (voegt een kind classificatie toe, momenteel altijd UNKNOWN).
Kan ik een afbeeldingresource wijzigen of verwijderen?
Nee — setter van image_resources veroorzaakt NotSupportedException, en PreservedResourceBlock.save() veroorzaakt NotImplementedError als deze direct wordt aangeroepen. Resources zijn alleen-lezen in deze FOSS-build.