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:$PYTHONPATHSteg 2: Importera erforderliga klasser
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsSteg 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.