Jak pracovat s PSD obrazovými zdroji v Python

Jak pracovat s PSD obrazovými zdroji v Python

Načtený PsdImage zveřejňuje své bloky zdrojů obrázku — položky ve stylu metadat, jako jsou mřížky, vodítka a data ICC profilů — prostřednictvím dvou jen pro čtení pohledů a také samostatného souhrnu pro indexované barevné palety.

Postupný návod

Krok 1: Nainstalujte balíček

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

Krok 2: Importujte požadované třídy

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

Krok 3: Zkontrolujte a spočítejte zdroje obrázků

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

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

Krok 4: Vypsat bloky zdrojů pomocí image_resources

PsdImage.image_resources vrací PreservedResourceBlock pro každý zdroj, s neupraveným ID zdroje, názvem a velikostí v bajtech:

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

Rozpoznat konkrétní zdroj porovnáním block.id s známými konstantami v ImageResourceIds:

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

Parser zdrojů v této FOSS verzi nedekóduje ID zdrojů do sémantických vlastností — porovnání block.id s ImageResourceIds sami je podporovaný způsob, jak rozpoznat konkrétní zdroj.


Krok 5: Vypsat souhrny zdrojů pomocí resources

PsdImage.resources vrací samostatný PsdResourceInfo souhrn pro každý zdroj, včetně kind klasifikace:

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

V této FOSS verzi je kind vždy PsdResourceKind.UNKNOWN — sémantická klasifikace konkrétních typů zdrojů (globální úhel, ICC profil) není implementována, takže kind považujte jen za informativní a spoléhejte se na resource_id (Krok 4) k rozpoznání konkrétního zdroje.


Krok 6: Načíst indexovanou barevnou paletu

Pokud jsou barvy dokumentu založeny na paletě, PsdImage.indexed_palette vrací její položky:

palette = image.indexed_palette

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

Běžné problémy a opravy

image.indexed_palette is None. Typ dat o barvách dokumentu není INDEXED_PALETTE — pouze dokumenty s indexovanými barvami obsahují paletu.

Setting image.image_resources raises NotSupportedException. Getter funguje pro výpis zdrojů, ale setter není v této FOSS verzi podporován.

Calling block.save() na PreservedResourceBlock raises NotImplementedError. Ukládání jednotlivých bloků zdrojů přímo není podporováno — zdroje se automaticky provádějí round-trip při volání image.save() na celý dokument.

has_icc_profile, is_icc_profile_untagged, a global_angle se nikdy nemění. Tyto tři PsdImage vlastnosti jsou pevné zástupné hodnoty v tomto FOSS buildu (has_icc_profile je vždy False, is_icc_profile_untagged je vždy None, global_angle je vždy 0) bez ohledu na skutečný obsah načteného dokumentu — parser zdrojů tohoto buildu neobnovuje ID-specifické sémantické hodnoty. Použijte Step 4’s block.id porovnání s ImageResourceIds pokud potřebujete tyto zdroje detekovat sami.

Často kladené otázky

Jaký je rozdíl mezi image_resources a resources?

Oba vypisují stejné podkladové bloky zdrojů, ale jako různé typy objektů: image_resources vrací objekty PreservedResourceBlock (surové ID/jméno/velikost, používané pro round-tripping), zatímco resources vrací souhrny PsdResourceInfo (přidává klasifikaci kind, která je momentálně vždy UNKNOWN).

Mohu upravit nebo odstranit obrazový zdroj?

Ne — setter image_resources vyvolá NotSupportedException a PreservedResourceBlock.save() vyvolá NotImplementedError, pokud je volán přímo. Zdroje jsou v této FOSS verzi jen pro čtení.

Viz také:

 Čeština