Cum să lucrați cu resursele de imagine PSD în Python
Un PsdImage încărcat expune blocurile sale de resurse de imagine — intrări de tip metadate, cum ar fi grile, ghidaje și încărcături de profil ICC — prin două vizualizări numai în citire, plus un rezumat separat pentru paletele de culori indexate.
Ghid pas cu pas
Pasul 1: Instalați pachetul
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:$PYTHONPATHPasul 2: Importați clasele necesare
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsPasul 3: Verificați și numărați resursele de imagine
image = PsdImage.load("input.psd")
print(f"Has image resources: {image.has_image_resources}")
print(f"Resource count: {image.resource_count}")Pasul 4: Listarea blocurilor de resurse prin image_resources
PsdImage.image_resources returnează un PreservedResourceBlock pentru fiecare resursă, cu ID-ul brut al resursei, numele și dimensiunea în bytes:
for block in image.image_resources:
print(f"ID: {block.id}, name: {block.name!r}, size: {block.size} bytes")Recunoaște o resursă specifică comparând block.id cu constantele cunoscute din ImageResourceIds:
for block in image.image_resources:
if block.id == ImageResourceIds.ICC_PROFILE:
print(f"Found an ICC profile resource ({block.data_size} bytes)")Parserul de resurse al acestei construcții FOSS nu decodează ID-urile de resurse în proprietăți semantice de la sine — compararea lui block.id cu ImageResourceIds de către tine este metoda suportată pentru a recunoaște o resursă specifică.
Pasul 5: Listarea rezumatelor de resurse prin resources
PsdImage.resources returnează un rezumat PsdResourceInfo separat pentru fiecare resursă, incluzând o clasificare kind:
for info in image.resources:
print(f"ID: {info.resource_id}, kind: {info.kind}, data length: {info.data_length}")În această construcție FOSS, kind este întotdeauna PsdResourceKind.UNKNOWN — clasificarea semantică a tipurilor specifice de resurse (unghi global, profil ICC) nu este implementată, așa că tratează kind doar ca informațional și bazează-te pe resource_id (Pasul 4) pentru a recunoaște o resursă specifică.
Pasul 6: Citește o paletă de culori indexată
Dacă datele de culoare ale documentului se bazează pe paletă, PsdImage.indexed_palette returnează intrările sale:
palette = image.indexed_palette
if palette is not None:
print(f"Palette entries: {len(palette.entries)}")Probleme comune și soluții
image.indexed_palette is None. Tipul de date de culoare al documentului nu este INDEXED_PALETTE — doar documentele cu culori indexate au o paletă.
Setting image.image_resources raises NotSupportedException. Metoda de accesare funcționează pentru listarea resurselor, dar metoda de setare nu este suportată în această versiune FOSS.
Calling block.save() pe un PreservedResourceBlock raises NotImplementedError. Salvarea blocurilor de resurse individuale direct nu este suportată — resursele fac round-trip automat când apelezi image.save() pe întregul document.
has_icc_profile, is_icc_profile_untagged, și global_angle nu se schimbă niciodată. Aceste trei PsdImage proprietăți sunt valori fixe de substituent în această construcție FOSS (has_icc_profile este întotdeauna False, is_icc_profile_untagged este întotdeauna None, global_angle este întotdeauna 0) indiferent de conținutul real al documentului încărcat — parserul de resurse al acestei construcții nu reconstruieste valori semantice specifice ID-ului. Folosiți pasul 4 block.id compararea cu ImageResourceIds dacă trebuie să detectați aceste resurse singur.
Întrebări frecvente
Care este diferența dintre image_resources și resources?
Ambele listează aceleași blocuri de resurse subiacente, dar ca tipuri diferite de obiecte: image_resources returnează obiecte PreservedResourceBlock (ID/nume/mărime brute, utilizate pentru round-tripping), în timp ce resources returnează rezumate PsdResourceInfo (adaugă o clasificare kind, în prezent întotdeauna UNKNOWN).
Pot modifica sau elimina o resursă de imagine?
Nu — setter-ul lui image_resources declanșează NotSupportedException, iar PreservedResourceBlock.save() declanșează NotImplementedError dacă este apelat direct. Resursele sunt numai în citire în această construcție FOSS.