Hur man arbetar med PSD-bildresurser i Python

Hur man arbetar med PSD-bildresurser i Python

En inläst PsdImage visar sina bildresursblock — metadata-liknande poster som rutnät, hjälplinjer och ICC-profildata — via två skrivskyddade vyer, plus en separat sammanfattning för indexerade färgpaletter.

Steg-för-steg-guide

Steg 1: Installera paketet

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

Steg 2: Importera erforderliga klasser

from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIds

Steg 3: Kontrollera och räkna bildresurser

image = PsdImage.load("input.psd")

print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")

Steg 4: Lista resursblock via image_resources

PsdImage.image_resources returnerar en PreservedResourceBlock per resurs, med det råa resurs-ID:t, namn och byte-storlek:

for block in image.image_resources:
    print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")

Identifiera en specifik resurs genom att jämföra block.id med de kända konstanterna i ImageResourceIds:

for block in image.image_resources:
    if block.id == ImageResourceIds.ICC_PROFILE:
        print(f"Found an ICC profile resource ({block.data_size} bytes)")

Den här FOSS-byggnadens resursparser avkodar inte resurs-ID:n till semantiska egenskaper själv — att jämföra block.id med ImageResourceIds själv är det stödjade sättet att identifiera en specifik resurs.


Steg 5: Lista resurssammanfattningar via resources

PsdImage.resources returnerar en separat PsdResourceInfo-sammanfattning per resurs, inklusive en kind-klassificering:

for info in image.resources:
    print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")

I den här FOSS-byggnaden är kind alltid PsdResourceKind.UNKNOWN — semantisk klassificering av specifika resurstyper (global vinkel, ICC-profil) är inte implementerad, så behandla kind endast som informativ och förlita dig på resource_id (Steg 4) för att identifiera en specifik resurs.


Steg 6: Läs en indexerad färgpalett

Om dokumentets färgdata är palettbaserad, returnerar PsdImage.indexed_palette dess poster:

palette = image.indexed_palette

if palette is not None:
    print(f"Palette entries: {len(palette.entries)}")

Vanliga problem och lösningar

image.indexed_palette is None. Dokumentets färgdatatyp är inte INDEXED_PALETTE — endast indexerade färgdokument har en palett.

Setting image.image_resources raises NotSupportedException. Getter-funktionen fungerar för att lista resurser, men setter-funktionen stöds inte i denna FOSS-byggnad.

Calling block.save() på en PreservedResourceBlock raises NotImplementedError. Att spara enskilda resursblock direkt stöds inte — resurser round-trip-as automatiskt när du anropar image.save() på hela dokumentet.

has_icc_profile, is_icc_profile_untagged, och global_angle ändras aldrig. Dessa tre PsdImage egenskaper är fasta platshållarvärden i denna FOSS-build (has_icc_profile är alltid False, is_icc_profile_untagged är alltid None, global_angle är alltid 0) oavsett det laddade dokumentets faktiska innehåll — denna byggnads resursparser rekonstruerar inte ID-specifika semantiska värden. Använd Steg 4:s block.id jämförelse mot ImageResourceIds om du behöver upptäcka dessa resurser själv.

Vanliga frågor

Vad är skillnaden mellan image_resources och resources?

Båda listar samma underliggande resursblock, men som olika objekttyper: image_resources returnerar PreservedResourceBlock objekt (rå ID/namn/storlek, används för round-tripping), medan resources returnerar PsdResourceInfo sammanfattningar (lägger till en kind klassificering, för närvarande alltid UNKNOWN).

Kan jag modifiera eller ta bort en bildresurs?

Nej — image_resourcess setter utlöser NotSupportedException, och PreservedResourceBlock.save() utlöser NotImplementedError om den anropas direkt. Resurser är skrivskyddade i detta FOSS-bygge.

Se även

 Svenska