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:$PYTHONPATHKrok 2: Zaimportuj wymagane klasy
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.resources.imageresourceids import ImageResourceIdsKrok 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.