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:$PYTHONPATHKrok 2: Importujte požadované třídy
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsKrok 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í.