Jak pracować z zasobami obrazu PSD w Python

Jak pracować z zasobami obrazu PSD w Python

Załadowany PsdImage udostępnia swoje bloki zasobów obrazu — wpisy w stylu metadanych, takie jak siatki, prowadnice i ładunki profilu ICC — poprzez dwa widoki tylko do odczytu, a także oddzielne podsumowanie palet kolorów indeksowanych.

Przewodnik krok po kroku

Krok 1: Zainstaluj pakiet

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: Zaimportuj wymagane klasy

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

Krok 3: Sprawdź i policz zasoby obrazu

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

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

Krok 4: Wyświetl bloki zasobów za pomocą image_resources

PsdImage.image_resources zwraca PreservedResourceBlock dla każdego zasobu, z surowym identyfikatorem zasobu, nazwą i rozmiarem w bajtach:

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

Rozpoznaj konkretny zasób, porównując block.id z znanymi stałymi w 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 zasobów w tej wersji FOSS nie dekoduje identyfikatorów zasobów na własności semantyczne — porównywanie block.id z ImageResourceIds samodzielnie jest wspieranym sposobem rozpoznania konkretnego zasobu.


Krok 5: Wyświetl podsumowania zasobów za pomocą resources

PsdImage.resources zwraca osobne podsumowanie PsdResourceInfo dla każdego zasobu, zawierające klasyfikację kind:

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

W tej wersji FOSS, kind jest zawsze PsdResourceKind.UNKNOWN — klasyfikacja semantyczna konkretnych rodzajów zasobów (globalny kąt, profil ICC) nie jest zaimplementowana, więc traktuj kind wyłącznie jako informacyjną i opieraj się na resource_id (Krok 4), aby rozpoznać konkretny zasób.


Krok 6: Odczytaj indeksowaną paletę kolorów

Jeżeli dane kolorów dokumentu są oparte na palecie, PsdImage.indexed_palette zwraca jej pozycje:

palette = image.indexed_palette

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

Typowe problemy i rozwiązania

image.indexed_palette is None. Typ danych kolorów dokumentu nie jest INDEXED_PALETTE — tylko dokumenty z indeksowanymi kolorami mają paletę.

Setting image.image_resources raises NotSupportedException. Getter działa przy wymienianiu zasobów, ale setter nie jest obsługiwany w tej wersji FOSS.

Calling block.save() na PreservedResourceBlock raises NotImplementedError. Zapisywanie pojedynczych bloków zasobów bezpośrednio nie jest obsługiwane — zasoby są automatycznie przetwarzane w trybie round-trip, gdy wywołasz image.save() na cały dokument.

has_icc_profile, is_icc_profile_untagged, oraz global_angle nigdy się nie zmieniają. Te trzy PsdImage właściwości są stałymi wartościami zastępczymi w tej wersji FOSS (has_icc_profile zawsze jest False, is_icc_profile_untagged zawsze jest None, global_angle zawsze jest 0Użyj kroku 4 block.id porównania z ImageResourceIds jeśli potrzebujesz samodzielnie wykryć te zasoby.

Najczęściej zadawane pytania

Jaka jest różnica między image_resources a resources?

Oba wymieniają te same podstawowe bloki zasobów, ale jako różne typy obiektów: image_resources zwraca obiekty PreservedResourceBlock (surowe ID/nazwę/rozmiar, używane do round-tripping), podczas gdy resources zwraca podsumowania PsdResourceInfo (dodaje klasyfikację kind, obecnie zawsze UNKNOWN).

Czy mogę modyfikować lub usunąć zasób obrazu?

Nie — image_resources’ setter zgłasza NotSupportedException, a PreservedResourceBlock.save() zgłasza NotImplementedError, jeśli wywołany bezpośrednio. Zasoby są tylko do odczytu w tej wersji FOSS.

Zobacz także

 Polski