# API de scripting Lua de pxstud.io — Correcciones

> Parte de la referencia de scripting Lua de pxstud.io, cuya introducción (https://pxstud.io/es/docs/scripting.md) explica sus convenciones. Los grupos de opciones y los tipos a los que remite están en https://pxstud.io/es/docs/scripting/option-groups.md y https://pxstud.io/es/docs/scripting/types.md. Todo en un solo archivo (en inglés): https://pxstud.io/llms-full.txt. El índice de todo el sitio (en inglés): https://pxstud.io/llms.txt.

### Correcciones
Las correcciones de color y los efectos de color del menú Filtro, cada uno un paso de deshacer sobre las celdas de una capa en los fotogramas que indiques. Ignoran la selección salvo que pases respectSelection = true, y nunca tocan los píxeles totalmente transparentes. En sprites indexados, indexedMode elige entre ajustar los píxeles recoloreados a la entrada de paleta más cercana ("remap") y editar las entradas de paleta que usan las celdas ("palette").

#### `app.antiAlias(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Suaviza con antialias los escalones donde el color A se encuentra con el color B en las celdas de una capa, al estilo pixel art, en un solo paso de deshacer: solo cambian los píxeles junto a un escalón de un píxel, más cuanto más largo es el tramo recto, mientras los bordes rectos, las esquinas y las diagonales a 45 grados siguen nítidos (app.setLayerEffects lo mantiene en vivo, kind "antiAlias"). Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se suavizan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Suaviza estas celdas, en varias capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `a` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#000000") — Color A: el color cuyos escalones se suavizan donde se encuentra con el color B.
  - `anyA` (boolean; predeterminado false) — Pasa true para tratar como A todo color visible distinto de B (para suavizar un contorno entero).
  - `b` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#ffffff") — Color B: el color con el que se encuentra A. Un color totalmente transparente (`"#00000000"`) significa cualquier píxel transparente; los intermedios desvanecen entonces el alfa de A.
  - `steps` (integer 1–4; predeterminado 2) — Cuántos colores intermedios se generan de A a B (en OKLCH), y el máximo de píxeles que toma un escalón.
  - `into` (string; predeterminado "b") — Qué lado del borde se repinta: "a", "b" o "both".
  - `strength` (integer 0–100; predeterminado 100) — Hasta dónde llega el suavizado a lo largo de cada tramo recto: 100 es hasta la mitad del tramo.
  - `colors` (string; predeterminado "any") — Pasa "palette" para ajustar los colores intermedios a las entradas de paleta más cercanas. Los sprites indexados siempre lo hacen.
  - `respectSelection` (boolean; predeterminado false) — Pasa true para cambiar solo los píxeles dentro de la selección actual. Por defecto se ignora la selección.

No devuelve nada.

#### `app.autoShade(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Sombrea colores planos según la dirección de la luz, como un único paso de deshacer (app.setLayerEffects con kind "autoShade" lo mantiene en vivo): los píxeles cerca del borde iluminado de cada región reciben pasos más claros, los cercanos al borde opuesto pasos más oscuros. Los pasos siguen la rampa cuando contiene el color; si no, se calculan en OKLCH. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotogramas cuyas celdas en esta capa se sombrean (un fotograma para la celda activa, todos para todas).
- `opts` (table, opcional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Sombrea estas celdas, en varias capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `target` (string; predeterminado "base") — Qué sombrear: "base" sombrea solo los píxeles del color base, "all" sombrea cada color plano con su propia rampa.
  - `base` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#808080") — El color que se sombrea cuando target es "base".
  - `angle` (integer 0–359; predeterminado 135) — De dónde viene la luz, en grados en sentido antihorario desde la derecha: 90 es arriba, 135 arriba a la izquierda, 270 abajo.
  - `highlights` (integer 0–5; predeterminado 2) — Cuántos pasos más claros recibe el lado iluminado; el borde es el más claro.
  - `shadows` (integer 0–5; predeterminado 2) — Cuántos pasos más oscuros recibe el lado opuesto; el borde es el más oscuro.
  - `width` (integer 1–4; predeterminado 1) — Cuántos píxeles de profundidad tiene cada paso.
  - `hueShift` (integer 0–100; predeterminado 30) — Cuánto giran las luces calculadas hacia el amarillo cálido y las sombras hacia el azul frío.
  - `chroma` (integer -100–100; predeterminado 0) — Cuánto más (o, en negativo, menos) colorido es cada paso calculado.
  - `rim` (boolean; predeterminado false) — Pasa true para una luz de 1 px a lo largo del borde exterior del lado en sombra.
  - `outline` (boolean; predeterminado false) — Pasa true para pintar el borde exterior de la forma un paso más oscuro que la sombra más profunda.
  - `colors` (string; predeterminado "any") — "palette" ajusta los pasos calculados a la paleta del fotograma; los sprites indexados siempre lo hacen.
  - `ramp` (Array of colors) — Una rampa de colores, en cualquier orden, que se recorre en lugar de calcular los pasos cuando contiene el color que se sombrea (por ejemplo app.getContext().shades). Vacía: calculados.
  - `respectSelection` (boolean; predeterminado false) — Pasa true para sombrear solo dentro de la selección actual. Por defecto se ignora la selección.

No devuelve nada.

#### `app.brightnessContrast(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Brillo/Contraste sobre las celdas de una capa, como un único paso de deshacer: cada canal pasa a ser 128 + factor * (value + brightness * 2.55 - 128), redondeado y limitado. No es la curva de Aseprite (que aplica primero el contraste y escala el brillo). Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `brightness` (number -100–100; predeterminado 0) — Suma brightness * 2.55 a cada canal de color, antes de la escala de contraste.
  - `contrast` (number -100–100; predeterminado 0) — Escala la distancia de cada canal a 128 por 259(C + 255) / (255(259 - C)), con C = contrast * 2.55: -100 aplana todo el color a 128, +100 se acerca a un umbral.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.colorBalance(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Balance de color sobre las celdas de una capa, como un único paso de deshacer: desplaza el color de las sombras, los tonos medios y las luces (ponderado por luma, 100 = 127.5 niveles con peso completo). Los píxeles totalmente transparentes se dejan como están. En sprites en escala de grises solo se aceptan desplazamientos con rojo, verde y azul iguales. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `shadows` ({ red = -100..100, green = -100..100, blue = -100..100 }) — El desplazamiento para los píxeles oscuros. Un rojo positivo se mueve hacia el rojo, uno negativo hacia el cian; igual con verde/magenta y azul/amarillo.
  - `midtones` ({ red = -100..100, green = -100..100, blue = -100..100 }) — El desplazamiento para los píxeles de luma media.
  - `highlights` ({ red = -100..100, green = -100..100, blue = -100..100 }) — El desplazamiento para los píxeles claros.
  - `preserveLuminosity` (boolean; predeterminado true) — Vuelve a añadir la luminosidad que cambió el desplazamiento, de modo que solo se mueva el color.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.colorCurve(layerId, frameIds, curves, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Curva de color sobre las celdas de una capa, como un único paso de deshacer: una curva cúbica monótona por canal (la de Aseprite es lineal, con una sola curva). Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `curves` (AdjustCurveChannel: "value" | "red" | "green" | "blue" | "alpha") — Nombre de canal a puntos de control, p. ej. { red = { {0, 0}, {128, 180}, {255, 255} } }. Canales: "value" (rojo, verde y azul por igual), "red", "green", "blue", "alpha"; los sprites en escala de grises solo aceptan "value" y "alpha". Los puntos son pares {x, y} (0-255, x estrictamente creciente, 2 o más); la curva es una spline monótona suave que pasa por ellos.
- `opts` (table, opcional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.convolutionMatrix(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Matriz de convolución sobre las celdas de una capa, como un único paso de deshacer: desenfoque, nitidez, detección de bordes, relieve o cualquier kernel que indiques. Los vecinos transparentes no oscurecen los colores. Los sprites indexados necesitan indexedMode "remap" (los resultados se ajustan a la entrada de paleta más cercana). Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `preset` (string) — Un kernel prediseñado en lugar de kernel/width/height: identity, gaussian3, box3, gaussian5, box5, sharpen, edge, emboss, sobelH, sobelV.
  - `width` (integer 1–9) — Ancho del kernel (impar). Obligatorio con kernel.
  - `height` (integer 1–9) — Alto del kernel (impar). Obligatorio con kernel.
  - `kernel` (list of width * height numbers, row by row) — Los pesos aplicados a la vecindad de cada píxel, p. ej. { 0, -1, 0, -1, 5, -1, 0, -1, 0 } da nitidez.
  - `divisor` (number; predeterminado the sum of the kernel (1 if it sums to 0)) — Cada suma ponderada se divide por este valor (no 0).
  - `bias` (number -255–255; predeterminado 0) — Se suma a cada canal tras dividir (128 centra en gris un resultado de bordes/relieve).
  - `red` (boolean; predeterminado true) — Convoluciona el canal rojo. En sprites en escala de grises rojo, verde y azul son el único canal de gris: establece los tres igual.
  - `green` (boolean; predeterminado true) — Convoluciona el canal verde.
  - `blue` (boolean; predeterminado true) — Convoluciona el canal azul.
  - `alpha` (boolean; predeterminado false) — Convoluciona también el canal alfa (un desenfoque entonces crece hacia los píxeles transparentes). Desactivado, los píxeles totalmente transparentes no se tocan.
  - `edges` (ConvolveEdges: "clamp" | "tiled"; predeterminado "clamp") — Qué se lee más allá del borde de la celda.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.despeckle(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Eliminar motas (un filtro de mediana) sobre las celdas de una capa, como un único paso de deshacer: elimina píxeles aislados y suaviza el ruido. Los sprites indexados necesitan indexedMode "remap". Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `width` (integer 1–9; predeterminado 3) — Ancho de la ventana de mediana (impar).
  - `height` (integer 1–9; predeterminado 3) — Alto de la ventana de mediana (impar).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.

No devuelve nada.

#### `app.dropShadow(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Dibuja una sombra proyectada, un resplandor o una sombra interior para las formas de las celdas de una capa, como un único paso de deshacer (app.setLayerEffects la mantiene activa en su lugar). Las sombras exteriores agrandan la celda, recortada al lienzo, y quedan debajo del arte. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa reciben la sombra (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `cels` (Array of { layerId = ..., frameId = ... }) — Aplica la sombra a estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `place` (OutlinePlace: "outside" | "inside"; predeterminado "outside") — Una sombra proyectada o un resplandor debajo del arte ("outside"), o una sombra interior sobre él ("inside").
  - `dx` (integer -10–10; predeterminado 1) — Cuánto cae la sombra hacia la derecha (negativo: izquierda). 0 y 0 crean un resplandor.
  - `dy` (integer -10–10; predeterminado 1) — Cuánto cae la sombra hacia abajo (negativo: arriba).
  - `spread` (integer 0–10; predeterminado 0) — Cuántos píxeles crece la sombra más allá de la silueta del arte.
  - `shape` (FxShape: "circle" | "square" | "diamond"; predeterminado "circle") — La huella de la expansión.
  - `softness` (integer 0–8; predeterminado 0) — Cuántos píxeles tarda en desvanecerse el borde de la sombra (un radio de desenfoque); 0 es un borde duro.
  - `edge` (ShadowEdge: "dithered" | "hard" | "smooth"; predeterminado "dithered") — Cómo se dibuja un borde suave (softness mayor que 0): "dithered" mantiene un solo color como un tramado ordenado que no se mueve cuando se mueve el arte, "hard" lo corta a media intensidad, "smooth" crea píxeles semitransparentes reales.
  - `color` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#00000080") — El color de la sombra; su alfa es la opacidad de la sombra. En un sprite indexado el resultado se ajusta a la paleta.
  - `respectSelection` (boolean; predeterminado false) — Pasa true para pintar solo dentro de la selección actual. Por defecto se ignora la selección.

No devuelve nada.

#### `app.gradientMap(layerId, frameIds, stops, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Mapa de degradado sobre las celdas de una capa, como un único paso de deshacer: la luma de cada píxel elige un color de la rampa. Un píxel conserva su alfa. Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `stops` (table) — De 2 a 32 puntos de degradado, `{ { color = ..., position = 0 }, { color = ..., position = 1 } }`: el color que toma un píxel con esa luma (0 = lo más oscuro, 1 = lo más claro).
- `opts` (table, opcional)
  - `space` (GradientMapSpace: "rgb" | "oklab" | "oklch"; predeterminado "oklab") — El espacio de color en el que se mezcla entre puntos.
  - `reverse` (boolean; predeterminado false) — Recorre la rampa de claro a oscuro.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.hueSaturation(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Tono/Saturación en modo hsv, hsl o un modo perceptual oklch sobre las celdas de una capa, como un único paso de deshacer. Una luminosidad y un alfa positivos suben hacia el máximo en lugar de multiplicar como hace Aseprite, así que +50 de luminosidad convierte el negro en gris medio. Los píxeles totalmente transparentes se dejan como están. En sprites en escala de grises el tono y la saturación no tienen efecto. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `mode` (AdjustHueMode: "hsv" | "hsl" | "oklch"; predeterminado "hsv") — El modelo de color en el que se trabaja.
  - `hue` (number -180–180; predeterminado 0) — Grados que se suman a cada tono.
  - `saturation` (number -100–100; predeterminado 0) — Escala la saturación (el croma en modo oklch): -100 es gris, +100 la duplica (limitada al máximo, o a la gama sRGB en modo oklch). Los grises siguen siendo grises.
  - `lightness` (number -100–100; predeterminado 0) — Luminosidad en los modos hsl y oklch, valor en modo hsv. Un valor positivo avanza esa proporción del camino restante hacia el blanco/máximo (l + (1 - l) * k, k = lightness / 100), así que +100 lo alcanza; uno negativo escala hacia el negro (l * (1 + k)), así que -100 lo alcanza.
  - `alpha` (number -100–100; predeterminado 0) — El mismo aumento sobre el alfa (redondeado): +100 vuelve opacos todos los píxeles no transparentes, -100 los vuelve transparentes.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.invertColor(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Invertir color, como en Aseprite, sobre las celdas de una capa, como un único paso de deshacer. Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `red` (boolean; predeterminado true) — Invierte el canal rojo. En sprites en escala de grises rojo, verde y azul son el único canal de gris: establece los tres igual.
  - `green` (boolean; predeterminado true) — Invierte el canal verde.
  - `blue` (boolean; predeterminado true) — Invierte el canal azul.
  - `alpha` (boolean; predeterminado false) — Invierte el canal alfa (los píxeles totalmente transparentes siguen siendo transparentes).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.levels(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Niveles sobre las celdas de una capa, como un único paso de deshacer: cada canal se reescala desde el rango de entrada, se curva con gamma y se asigna al rango de salida. Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `inBlack` (integer 0–254; predeterminado 0) — Los valores de entrada iguales o inferiores a este pasan a ser outBlack.
  - `inWhite` (integer 1–255; predeterminado 255) — Los valores de entrada iguales o superiores a este pasan a ser outWhite. Debe ser mayor que inBlack.
  - `gamma` (number 0.1–10; predeterminado 1) — Curva de tonos medios: por encima de 1 los aclara, por debajo de 1 los oscurece.
  - `outBlack` (integer 0–255; predeterminado 0) — El valor de salida para la entrada negra.
  - `outWhite` (integer 0–255; predeterminado 255) — El valor de salida para la entrada blanca. Si es menor que outBlack, invierte.
  - `red` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Niveles solo para el canal rojo, aplicados después de los generales. Los sprites en escala de grises rechazan canales individuales.
  - `green` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Niveles solo para el canal verde.
  - `blue` ({ inBlack, inWhite, gamma, outBlack, outWhite }) — Niveles solo para el canal azul.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.posterize(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Posterizar: reduce cada canal de color de las celdas de una capa a unos pocos niveles, como un único paso de deshacer. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `levels` (integer 2–256; predeterminado 4) — Niveles distintos que se conservan por canal de color (el alfa no se toca).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.reduceColors(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Reducir colores: asigna las celdas de una capa a unos pocos colores (generados a partir de esas celdas, o la paleta), opcionalmente con tramado, como un único paso de deshacer. Se conserva el alfa; el sprite sigue en su modo de color. Los sprites indexados necesitan indexedMode "remap". Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `colors` (integer 1–256; predeterminado 16) — Cuántos colores se conservan (paletteSource "generate").
  - `paletteSource` (ReduceColorsPalette: "generate" | "palette"; predeterminado "generate") — Genera los colores a partir de las celdas, o usa la paleta del sprite.
  - `dithering` (DitherMethod: "none" | "bayer2" | "bayer4" | "bayer8" | "floydSteinberg" | "atkinson"; predeterminado "none") — Cómo se aproximan los colores intermedios.
  - `ditherAmount` (integer 0–100; predeterminado 100) — Intensidad del tramado (0 = solo el color más cercano).
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.

No devuelve nada.

#### `app.replaceColor(layerId, frameIds, from, to, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Reemplazar color, como en Aseprite, sobre las celdas de una capa, como un único paso de deshacer. Los píxeles totalmente transparentes nunca coinciden. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `from` (color) — El color que se busca.
- `to` (color) — El color que se pone en su lugar (alfa incluido).
- `opts` (table, opcional)
  - `tolerance` (integer 0–255; predeterminado 0) — Un píxel coincide cuando ninguno de sus canales r, g, b, a está a más de esta distancia de `from`.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.

#### `app.threshold(layerId, frameIds, opts?)` — modifica, deshacible, se rechaza en una capa bloqueada
Filtro > Umbral sobre las celdas de una capa, como un único paso de deshacer: cada píxel pasa a ser uno de dos colores según su luma (el rgb_luma de Aseprite). Los píxeles totalmente transparentes se dejan como están. Solo capas de imagen.

- `layerId` (string)
- `frameIds` (table) — Array de ids de fotograma cuyas celdas en esta capa se ajustan (un fotograma para la celda activa, todos los fotogramas para todas).
- `opts` (table, opcional)
  - `level` (integer 0–255; predeterminado 128) — Los píxeles cuya luma es al menos esta pasan a `above`, el resto a `below`.
  - `below` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#000000") — El color de los píxeles por debajo del nivel. Se ignora el alfa: cada píxel conserva el suyo.
  - `above` (color ("#rgb", "#rrggbb[aa]" or { r, g, b, a }); predeterminado "#ffffff") — El color de los píxeles iguales o superiores al nivel. Se ignora el alfa.
  - `cels` (Array of { layerId = ..., frameId = ... }) — Ajusta estas celdas, entre capas y fotogramas, en lugar de layerId/frameIds (pasa nil en ambos).
  - `respectSelection` (boolean; predeterminado false) — Pasa true para ajustar solo dentro de la selección actual. Por defecto se ignora la selección.
  - `indexedMode` (AdjustIndexedMode: "remap" | "palette"; predeterminado "remap") — Solo sprites indexados: recolorea los píxeles y los ajusta a la entrada de paleta más cercana, o edita las entradas de paleta que usan las celdas.

No devuelve nada.
