# Lua-Skript-API von pxstud.io — Anpassungen

> Teil der Lua-Skript-Referenz von pxstud.io, deren Übersicht (https://pxstud.io/de/docs/scripting.md) die Konventionen erklärt. Die Optionsgruppen und Typen, auf die sie verweist, stehen in https://pxstud.io/de/docs/scripting/option-groups.md und https://pxstud.io/de/docs/scripting/types.md. Alles in einer Datei (auf Englisch): https://pxstud.io/llms-full.txt. Das Verzeichnis der ganzen Website (auf Englisch): https://pxstud.io/llms.txt.

### Anpassungen
Die Farbanpassungen und Farb-FX des Filter-Menüs, jede ein Rückgängig-Schritt über die Cels einer Ebene in den Frames, die du auflistest. Sie ignorieren die Auswahl, solange du nicht respectSelection = true übergibst, und berühren nie vollständig transparente Pixel. Auf indizierten Sprites wählt indexedMode zwischen dem Einrasten der umgefärbten Pixel auf den nächsten Paletteneintrag ("remap") und dem Bearbeiten der Paletteneinträge, die die Cels nutzen ("palette").

#### `app.antiAlias(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Glättet die Treppenstufen, wo Farbe A auf den Cels einer Ebene auf Farbe B trifft, im Pixel-Art-Stil, als ein einziger Rückgängig-Schritt: Nur die Pixel neben einer Ein-Pixel-Stufe ändern sich, umso mehr, je länger das gerade Stück ist, während gerade Kanten, Ecken und 45-Grad-Diagonalen scharf bleiben (app.setLayerEffects hält es stattdessen live, kind "antiAlias"). Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene geglättet werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Glättet diese Cels über Ebenen und Frames hinweg statt layerId/frameIds (übergib für beide nil).
  - `a` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#000000") — Farbe A: die Farbe, deren Treppenstufen geglättet werden, wo sie auf Farbe B trifft.
  - `anyA` (boolean; Standard false) — Übergib true, damit jede sichtbare Farbe außer B als A gilt (um eine ganze Kontur zu glätten).
  - `b` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#ffffff") — Farbe B: die Farbe, auf die A trifft. Eine vollständig transparente Farbe (`"#00000000"`) steht für jedes transparente Pixel; die Zwischenfarben blenden dann das Alpha von A aus.
  - `steps` (integer 1–4; Standard 2) — Wie viele Zwischenfarben von A nach B erzeugt werden (in OKLCH) und wie viele Pixel eine Stufe höchstens bekommt.
  - `into` (string; Standard "b") — Welche Seite der Kante neu gemalt wird: "a", "b" oder "both".
  - `strength` (integer 0–100; Standard 100) — Wie weit die Glättung entlang jedes geraden Stücks reicht: 100 ist bis zur Hälfte des Stücks.
  - `colors` (string; Standard "any") — Übergib "palette", um die Zwischenfarben auf die nächsten Paletteneinträge zu setzen. Indizierte Sprites tun das immer.
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur Pixel innerhalb der aktuellen Auswahl zu ändern. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.autoShade(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Schattiert flache Farben aus einer Lichtrichtung, als ein einziger Rückgängig-Schritt (app.setLayerEffects mit kind "autoShade" hält es stattdessen live): Pixel nahe der beleuchteten Kante jeder Region erhalten hellere Stufen, nahe der gegenüberliegenden Kante dunklere. Die Stufen folgen dem Farbverlauf, wenn er die Farbe enthält, sonst werden sie in OKLCH berechnet. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene schattiert werden (ein Frame für das aktive Cel, alle Frames für alle).
- `opts` (table, optional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Schattiert diese Cels über Ebenen und Frames hinweg statt layerId/frameIds (übergib für beide nil).
  - `target` (string; Standard "base") — Was schattiert wird: "base" schattiert nur die Pixel der Grundfarbe, "all" schattiert jede flache Farbe mit einem eigenen Farbverlauf.
  - `base` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#808080") — Die zu schattierende Farbe, wenn target "base" ist.
  - `angle` (integer 0–359; Standard 135) — Woher das Licht kommt, in Grad gegen den Uhrzeigersinn von rechts: 90 ist oben, 135 oben links, 270 unten.
  - `highlights` (integer 0–5; Standard 2) — Wie viele hellere Stufen die beleuchtete Seite erhält; die Kante ist die hellste.
  - `shadows` (integer 0–5; Standard 2) — Wie viele dunklere Stufen die abgewandte Seite erhält; die Kante ist die dunkelste.
  - `width` (integer 1–4; Standard 1) — Wie viele Pixel tief jede Stufe ist.
  - `hueShift` (integer 0–100; Standard 30) — Wie weit berechnete Lichter zu warmem Gelb und Schatten zu kühlem Blau gedreht werden.
  - `chroma` (integer -100–100; Standard 0) — Wie viel bunter (oder, negativ, weniger bunt) jede berechnete Stufe wird.
  - `rim` (boolean; Standard false) — Übergib true für ein 1 px breites Licht entlang der Außenkante der Schattenseite.
  - `outline` (boolean; Standard false) — Übergib true, um die Außenkante der Form eine Stufe dunkler als den tiefsten Schatten zu malen.
  - `colors` (string; Standard "any") — "palette" rastet die berechneten Stufen auf die Palette des Frames ein; indizierte Sprites tun das immer.
  - `ramp` (Array of colors) — Ein Farbverlauf in beliebiger Richtung, der statt berechneter Stufen durchlaufen wird, wenn er die schattierte Farbe enthält (zum Beispiel app.getContext().shades). Leer: berechnet.
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl zu schattieren. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.brightnessContrast(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Helligkeit/Kontrast auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: Jeder Kanal wird zu 128 + factor * (value + brightness * 2.55 - 128), gerundet und begrenzt. Nicht die Kurve von Aseprite (die wendet zuerst den Kontrast an und skaliert die Helligkeit). Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `brightness` (number -100–100; Standard 0) — Addiert brightness * 2.55 zu jedem Farbkanal, vor der Kontrastskalierung.
  - `contrast` (number -100–100; Standard 0) — Skaliert den Abstand jedes Kanals von 128 mit 259(C + 255) / (255(259 - C)), wobei C = contrast * 2.55: -100 flacht alle Farben auf 128 ab, +100 kommt einem Schwellenwert nahe.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.colorBalance(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farbbalance auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: verschiebt die Farbe von Tiefen, Mitteltönen und Lichtern (nach Luma gewichtet, 100 = 127.5 Stufen bei vollem Gewicht). Vollständig transparente Pixel bleiben unberührt. Auf Graustufen-Sprites werden nur Verschiebungen mit gleichem Rot, Grün und Blau akzeptiert. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `shadows` ({ red = -100..100, green = -100..100, blue = -100..100 }) — Die Verschiebung für dunkle Pixel. Positives Rot verschiebt Richtung Rot, negatives Richtung Cyan; ebenso Grün/Magenta und Blau/Gelb.
  - `midtones` ({ red = -100..100, green = -100..100, blue = -100..100 }) — Die Verschiebung für Pixel mit mittlerem Luma.
  - `highlights` ({ red = -100..100, green = -100..100, blue = -100..100 }) — Die Verschiebung für helle Pixel.
  - `preserveLuminosity` (boolean; Standard true) — Gibt die Helligkeit, die die Verschiebung verändert hat, wieder dazu, sodass sich nur die Farbe bewegt.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.colorCurve(layerId, frameIds, curves, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farbkurve auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: eine monotone kubische Kurve pro Kanal (die von Aseprite ist linear, mit einer Kurve). Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `curves` (AdjustCurveChannel: "value" | "red" | "green" | "blue" | "alpha") — Kanalname zu Kontrollpunkten, z. B. { red = { {0, 0}, {128, 180}, {255, 255} } }. Kanäle: "value" (Rot, Grün und Blau gleichermaßen), "red", "green", "blue", "alpha"; Graustufen-Sprites nehmen nur "value" und "alpha". Punkte sind {x, y}-Paare (0-255, x streng aufsteigend, 2 oder mehr); die Kurve ist ein glatter monotoner Spline durch sie.
- `opts` (table, optional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.convolutionMatrix(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Faltungsmatrix auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: Weichzeichnen, Schärfen, Kantenerkennung, Prägen oder jeder Kernel, den du angibst. Transparente Nachbarn dunkeln Farben nicht ab. Indizierte Sprites brauchen indexedMode "remap" (die Ergebnisse rasten auf den nächsten Paletteneintrag ein). Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `preset` (string) — Ein vorgefertigter Kernel statt kernel/width/height: identity, gaussian3, box3, gaussian5, box5, sharpen, edge, emboss, sobelH, sobelV.
  - `width` (integer 1–9) — Kernelbreite (ungerade). Erforderlich mit kernel.
  - `height` (integer 1–9) — Kernelhöhe (ungerade). Erforderlich mit kernel.
  - `kernel` (list of width * height numbers, row by row) — Die Gewichte, die auf die Nachbarschaft jedes Pixels angewendet werden, z. B. { 0, -1, 0, -1, 5, -1, 0, -1, 0 } schärft.
  - `divisor` (number; Standard the sum of the kernel (1 if it sums to 0)) — Jede gewichtete Summe wird dadurch geteilt (nicht 0).
  - `bias` (number -255–255; Standard 0) — Wird nach dem Teilen zu jedem Kanal addiert (128 zentriert ein Kanten-/Präge-Ergebnis auf Grau).
  - `red` (boolean; Standard true) — Faltet den Rotkanal. Auf Graustufen-Sprites sind Rot, Grün und Blau der eine Grau-Kanal: Setze alle drei gleich.
  - `green` (boolean; Standard true) — Faltet den Grünkanal.
  - `blue` (boolean; Standard true) — Faltet den Blaukanal.
  - `alpha` (boolean; Standard false) — Faltet auch den Alphakanal (ein Weichzeichner wächst dann in transparente Pixel hinein). Aus, bleiben vollständig transparente Pixel unberührt.
  - `edges` (ConvolveEdges: "clamp" | "tiled"; Standard "clamp") — Was jenseits des Cel-Rands gelesen wird.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.despeckle(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Flecken entfernen (ein Medianfilter) auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: entfernt einzelne Pixel und glättet Rauschen. Indizierte Sprites brauchen indexedMode "remap". Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `width` (integer 1–9; Standard 3) — Breite des Medianfensters (ungerade).
  - `height` (integer 1–9; Standard 3) — Höhe des Medianfensters (ungerade).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.dropShadow(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Zeichnet einen Schlagschatten, ein Leuchten oder einen inneren Schatten für die Formen auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt (app.setLayerEffects hält ihn stattdessen live). Äußere Schatten lassen das Cel wachsen, auf die Leinwand beschnitten, und liegen unter der Grafik. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene den Schatten erhalten (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Versieht diese Cels über Ebenen und Frames hinweg mit Schatten, statt layerId/frameIds (übergib nil für beide).
  - `place` (OutlinePlace: "outside" | "inside"; Standard "outside") — Ein Schlagschatten oder Leuchten unter der Grafik ("outside") oder ein innerer Schatten darüber ("inside").
  - `dx` (integer -10–10; Standard 1) — Wie weit der Schatten nach rechts fällt (negativ: links). 0 und 0 ergibt ein Leuchten.
  - `dy` (integer -10–10; Standard 1) — Wie weit der Schatten nach unten fällt (negativ: oben).
  - `spread` (integer 0–10; Standard 0) — Um wie viele Pixel der Schatten über die Silhouette der Grafik hinauswächst.
  - `shape` (FxShape: "circle" | "square" | "diamond"; Standard "circle") — Der Fußabdruck der Ausbreitung.
  - `softness` (integer 0–8; Standard 0) — Über wie viele Pixel der Rand des Schattens ausläuft (ein Weichzeichnungsradius); 0 ist ein harter Rand.
  - `edge` (ShadowEdge: "dithered" | "hard" | "smooth"; Standard "dithered") — Wie ein weicher Rand (softness über 0) gezeichnet wird: "dithered" behält eine einzige Farbe als geordnetes Dithering, das stehen bleibt, wenn sich die Grafik bewegt, "hard" schneidet ihn bei halber Stärke ab, "smooth" erzeugt echte halbtransparente Pixel.
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#00000080") — Die Schattenfarbe; ihr Alpha ist die Deckkraft des Schattens. Auf einem indizierten Sprite rastet das Ergebnis auf die Palette ein.
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl zu malen. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.gradientMap(layerId, frameIds, stops, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Verlaufsumsetzung auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: Das Luma jedes Pixels wählt eine Farbe aus der Farbreihe. Ein Pixel behält sein Alpha. Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `stops` (table) — 2-32 Verlaufsstopps, `{ { color = ..., position = 0 }, { color = ..., position = 1 } }`: die Farbe, die ein Pixel bei diesem Luma annimmt (0 = am dunkelsten, 1 = am hellsten).
- `opts` (table, optional)
  - `space` (GradientMapSpace: "rgb" | "oklab" | "oklch"; Standard "oklab") — Der Farbraum, in dem zwischen den Stopps gemischt wird.
  - `reverse` (boolean; Standard false) — Lässt die Farbreihe von hell nach dunkel laufen.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.hueSaturation(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farbton/Sättigung in einem hsv-, hsl- oder wahrnehmungsbasierten oklch-Modus auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt. Positive Helligkeit und Alpha heben Richtung voll an, statt zu multiplizieren wie bei Aseprite, sodass +50 Helligkeit Schwarz zu Mittelgrau macht. Vollständig transparente Pixel bleiben unberührt. Auf Graustufen-Sprites haben Farbton und Sättigung keine Wirkung. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `mode` (AdjustHueMode: "hsv" | "hsl" | "oklch"; Standard "hsv") — Das Farbmodell, in dem gearbeitet wird.
  - `hue` (number -180–180; Standard 0) — Grad, die zu jedem Farbton addiert werden.
  - `saturation` (number -100–100; Standard 0) — Skaliert die Sättigung (Chroma im oklch-Modus): -100 ist Grau, +100 verdoppelt sie (begrenzt auf voll, oder im oklch-Modus auf den sRGB-Farbraum). Grautöne bleiben grau.
  - `lightness` (number -100–100; Standard 0) — Helligkeit in den Modi hsl und oklch, Wert im Modus hsv. Positiv bewegt diesen Anteil des restlichen Wegs zu Weiß/voll (l + (1 - l) * k, k = lightness / 100), sodass +100 es erreicht; negativ skaliert Richtung Schwarz (l * (1 + k)), sodass -100 es erreicht.
  - `alpha` (number -100–100; Standard 0) — Dieselbe Anhebung beim Alpha (gerundet): +100 macht jedes nicht transparente Pixel deckend, -100 macht sie transparent.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.invertColor(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farben umkehren, wie in Aseprite, auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt. Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `red` (boolean; Standard true) — Kehrt den Rotkanal um. Auf Graustufen-Sprites sind Rot, Grün und Blau der eine Grau-Kanal: Setze alle drei gleich.
  - `green` (boolean; Standard true) — Kehrt den Grünkanal um.
  - `blue` (boolean; Standard true) — Kehrt den Blaukanal um.
  - `alpha` (boolean; Standard false) — Kehrt den Alphakanal um (vollständig transparente Pixel bleiben trotzdem transparent).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.levels(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Tonwertkorrektur auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: Jeder Kanal wird aus dem Eingabebereich neu skaliert, per Gamma gebogen und auf den Ausgabebereich abgebildet. Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `inBlack` (integer 0–254; Standard 0) — Eingabewerte auf oder unter diesem Wert werden zu outBlack.
  - `inWhite` (integer 1–255; Standard 255) — Eingabewerte auf oder über diesem Wert werden zu outWhite. Muss über inBlack liegen.
  - `gamma` (number 0.1–10; Standard 1) — Mitteltonkurve: über 1 hellt die Mitteltöne auf, unter 1 dunkelt sie ab.
  - `outBlack` (integer 0–255; Standard 0) — Der Ausgabewert für schwarze Eingabe.
  - `outWhite` (integer 0–255; Standard 255) — Der Ausgabewert für weiße Eingabe. Unter outBlack kehrt um.
  - `red` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Tonwerte nur für den Rotkanal, nach den Master-Tonwerten angewendet. Graustufen-Sprites lehnen einzelne Kanäle ab.
  - `green` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Tonwerte nur für den Grünkanal.
  - `blue` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Tonwerte nur für den Blaukanal.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.posterize(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Tontrennung: reduziert jeden Farbkanal der Cels einer Ebene auf wenige Stufen, als ein einziger Rückgängig-Schritt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `levels` (integer 2–256; Standard 4) — Unterschiedliche Stufen, die pro Farbkanal erhalten bleiben (Alpha bleibt unberührt).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.reduceColors(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farben reduzieren: bildet die Cels einer Ebene auf wenige Farben ab (aus diesen Cels erzeugt oder aus der Palette), optional mit Dithering, als ein einziger Rückgängig-Schritt. Alpha bleibt erhalten; der Sprite bleibt in seinem Farbmodus. Indizierte Sprites brauchen indexedMode "remap". Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `colors` (integer 1–256; Standard 16) — Wie viele Farben erhalten bleiben (paletteSource "generate").
  - `paletteSource` (ReduceColorsPalette: "generate" | "palette"; Standard "generate") — Erzeugt die Farben aus den Cels oder nutzt die Palette des Sprites.
  - `dithering` (DitherMethod: "none" | "bayer2" | "bayer4" | "bayer8" | "floydSteinberg" | "atkinson"; Standard "none") — Wie Zwischenfarben angenähert werden.
  - `ditherAmount` (integer 0–100; Standard 100) — Dithering-Stärke (0 = nur die nächste Farbe).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.

Gibt nichts zurück.

#### `app.replaceColor(layerId, frameIds, from, to, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Farbe ersetzen, wie in Aseprite, auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt. Vollständig transparente Pixel werden nie getroffen. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `from` (color) — Die Farbe, die gesucht wird.
- `to` (color) — Die Farbe, die an ihre Stelle kommt (Alpha eingeschlossen).
- `opts` (table, optional)
  - `tolerance` (integer 0–255; Standard 0) — Ein Pixel trifft, wenn keiner seiner Kanäle r, g, b, a weiter als dieser Wert von `from` entfernt ist.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.

#### `app.threshold(layerId, frameIds, opts?)` — ändert, rückgängig machbar, wird auf einer gesperrten Ebene abgelehnt
Filter > Schwellenwert auf den Cels einer Ebene, als ein einziger Rückgängig-Schritt: Jedes Pixel wird anhand seines Lumas zu einer von zwei Farben (rgb_luma von Aseprite). Vollständig transparente Pixel bleiben unberührt. Nur Bildebenen.

- `layerId` (string)
- `frameIds` (table) — Array von Frame-IDs, deren Cels auf dieser Ebene angepasst werden (ein Frame für das aktive Cel, jeder Frame für alle).
- `opts` (table, optional)
  - `level` (integer 0–255; Standard 128) — Pixel, deren Luma mindestens so hoch ist, werden zu `above`, der Rest zu `below`.
  - `below` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#000000") — Die Farbe der Pixel unter dem Wert. Alpha wird ignoriert: Ein Pixel behält sein eigenes.
  - `above` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); Standard "#ffffff") — Die Farbe der Pixel auf oder über dem Wert. Alpha wird ignoriert.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Passt diese Cels über Ebenen und Frames hinweg an, statt layerId/frameIds (übergib nil für beide).
  - `respectSelection` (boolean; Standard false) — Übergib true, um nur innerhalb der aktuellen Auswahl anzupassen. Standardmäßig wird die Auswahl ignoriert.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; Standard "remap") — Nur indizierte Sprites: färbt die Pixel um und rastet sie auf den nächsten Paletteneintrag ein, oder bearbeitet die Paletteneinträge, die die Cels nutzen.

Gibt nichts zurück.
