Jak sprawdzić sekcje dokumentu PSD w Python

Jak sprawdzić sekcje dokumentu PSD w Python

Załadowany PsdImage udostępnia obiekty podsumowujące w trybie tylko do odczytu dla strukturalnych sekcji dokumentu PSD/PSB — nagłówka, sekcji danych kolorów, sekcji danych obrazu oraz sekcji zasobów obrazu — bez konieczności ręcznego parsowania na poziomie bajtów.

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

Krok 3: Sprawdź sekcję nagłówka

PsdImage.header zwraca PsdHeader z surowymi polami strukturalnymi dokumentu:

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

header = image.header
print(f"Size: {header.width}x{header.height}, channels: {header.channels}")
print(f"Bit depth: {header.bit_depth}, raw color mode: {header.color_mode}")
print(f"Is PSB: {header.is_large_document}")

PsdHeader.color_mode zwraca surowe pole trybu koloru jako liczbę całkowitą przechowywaną w pliku — użyj PsdImage.color_mode zamiast tego, jeśli potrzebujesz ściśle typowanego wyliczenia ColorModes.


Krok 4: Sprawdź sekcję danych kolorów

PsdImage.color_data_info zwraca PsdColorDataInfo podsumowanie; kind jest wartością PsdColorDataKind (NONE, INDEXED_PALETTE, RGB_PAYLOAD, CMYK_PAYLOAD lub RAW_PRESERVED):

if image.has_color_mode_data:
    color_info = image.color_data_info
    print(f"Color data kind: {color_info.kind}, raw bytes: {color_info.raw_data_length}")

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

Krok 5: Sprawdź sekcję danych obrazu

PsdImage.image_data_info zwraca PsdImageDataInfo podsumowanie opisujące, jak zakodowane są połączone dane pikseli:

data_info = image.image_data_info
print(f"Compression: {image.compression}")
print(f"Data kind: {data_info.kind}, uses prediction: {data_info.uses_prediction}")
print(f"Compressed payload length: {data_info.compressed_payload_length}")

data_info.kind jest wartością ImageDataKind (RAW, RLE, ZIP lub UNKNOWN) opisującą własne kodowanie połączonych danych obrazu — image.compression zgłasza to samo kodowanie za pomocą osobnego wyliczenia CompressionMethod.


Krok 6: Sprawdź sekcję zasobów obrazu

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

for resource in image.resources:
    print(f"Resource ID: {resource.resource_id}, kind: {resource.kind}")

PsdImage.resources zwraca tylko do odczytu PsdResourceInfo streszczenia. Oddzielny PsdImage.image_resources właściwość ma także getter, ale jej setter podnosi NotSupportedException w tej wersji FOSS — zobacz Troubleshooting dla pełnej listy setterów tylko do odczytu.

Typowe problemy i rozwiązania

header.color_mode nie pasuje image.color_mode. To jest oczekiwane — PsdHeader.color_mode jest surowym polem całkowitoliczbowym z pliku, podczas gdy PsdImage.color_mode jest silnie typowany ColorModes enum zbudowany z tego.

color_data_info.indexed_palette is None. Rodzaj danych kolorów dokumentu nie jest INDEXED_PALETTE — tylko dokumenty z indeksowanymi kolorami zawierają paletę.

Setting image.image_resources raises NotSupportedException. Ten setter nie jest obsługiwany w tej wersji FOSS; traktuj image_resources and resources jako tylko do odczytu.

Najczęściej zadawane pytania

Czy mogę modyfikować bezpośrednio sekcje nagłówka, danych kolorów lub danych obrazu?

Nie — PsdHeader, PsdColorDataInfo, ColorData i PsdImageDataInfo są wszystkimi obiektami podsumowania tylko do odczytu w tej wersji FOSS. Nie ma publicznych setterów dla żadnej z ich właściwości.

Jaka jest różnica między image.compression a image.image_data_kind?

Opisują to samo podstawowe kodowanie za pomocą dwóch osobnych wyliczeń: image.compression zwraca wartość CompressionMethod, podczas gdy image.image_data_info.kind zwraca wartość ImageDataKind.

Zobacz także

 Polski