Jak pracować z warstwami PSD w Python
Ten przewodnik pokazuje, jak wyświetlić listę warstw dokumentu, odczytać i zmienić edytowalne metadane warstwy, przemieścić warstwę oraz usunąć warstwę z kolekcji. Właściwość layers załadowanego PsdImage zwraca jego kolekcję obiektów Layer. Każdy Layer udostępnia edytowalne metadane — nazwę, widoczność, krycie, przycięcie, tryb mieszania i pozycję (krawędzie granic) — oraz informacje tylko do odczytu o całkowitych granicach i kanałach.
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
PsdImage ładuje dokument; BlendMode jest używany później do ustawienia trybu mieszania warstwy:
from aspose_psd_foss.psdimage import PsdImage
from aspose_psd_foss.layers.blendmode import BlendModeKrok 3: Załaduj dokument i wyświetl jego warstwy
Załaduj dokument, a następnie iteruj layers, aby zobaczyć nazwę i geometrię każdej warstwy:
image = PsdImage.load("input.psd")
for layer in image.layers:
print(f"{layer.name}: {layer.width}x{layer.height} at ({layer.left},{layer.top})")Krok 4: Odczytaj i edytuj widoczność warstwy, krycie oraz tryb mieszania
is_visible, opacity (zwykle 0-255), clipping, name i blend_mode_key wszystkie mają działające settery:
layer = image.layers[0]
layer.is_visible = False # hide the layer
layer.opacity = 200 # ~78% opacity
layer.blend_mode_key = BlendMode.MULTIPLY
layer.name = "Renamed Layer"Krok 5: Odczytaj i przesuń granice warstwy
bounds, width, height i channels_count są tylko do odczytu — ale top, left, bottom i right każdy ma działający setter, który przemieszcza warstwę:
print(f"Bounds: {layer.bounds}")
print(f"Channels: {layer.channels_count}")
layer.left = 10
layer.top = 20
layer.right = 40
layer.bottom = 60Krok 6: Zastąp kolekcję warstw
PsdImage.layers sam ma działający setter, więc możesz zastąpić całą kolekcję (na przykład, aby usunąć warstwę):
image.layers = [l for l in image.layers if l.name != "Renamed Layer"]Krok 7: Zapisz dokument
Zapisz wszystkie zmiany wprowadzone w poprzednich krokach na dysku, a następnie zwolnij zasoby obrazu:
image.save("output.psd")
image.dispose()Typowe problemy i rozwiązania
NotSupportedException przy ustawianiu channel_information, layer_mask_data, lub layer_blending_ranges_data. Te trzy Layer ustawienia nie są obsługiwane w tej wersji FOSS — traktuj je jako tylko do odczytu.
Wartość przezroczystości wygląda nieprawidłowo po jej ustawieniu. opacity zazwyczaj jest wartością 0-255, a nie ułamkiem 0.0-1.0 ani procentem — layer.opacity = 200 oznacza w przybliżeniu 78% nieprzezroczystości (200/255).
Zmiany w warstwie nie pojawiają się po zapisaniu. Potwierdź, że modyfikujesz Layer instancję uzyskaną z image.layers, i że wywołujesz image.save() po wprowadzeniu swoich zmian.
Najczęściej zadawane pytania
Czy mogę usunąć warstwę z dokumentu?
Tak — PsdImage.layers ma działający setter, więc możesz przypisać mu przefiltrowaną listę, aby usunąć warstwy (zobacz krok 6).
Jakie tryby mieszania są dostępne?
BlendMode zawiera wartości takie jak NORMAL, MULTIPLY, SCREEN, OVERLAY i DARKEN, między innymi — ustawiane za pomocą Layer.blend_mode_key.
Czy dane maski warstwy są dostępne?
Layer.layer_mask_data ma działający getter, ale jego setter podnosi NotSupportedException w tej wersji FOSS.