# API di scripting Lua di pxstud.io — Image

> Parte del riferimento di scripting Lua di pxstud.io, la cui panoramica (https://pxstud.io/it/docs/scripting.md) ne spiega le convenzioni. I gruppi di opzioni e i tipi a cui rimanda sono in https://pxstud.io/it/docs/scripting/option-groups.md e https://pxstud.io/it/docs/scripting/types.md. Tutto in un unico file (in inglese): https://pxstud.io/llms-full.txt. L'indice dell'intero sito (in inglese): https://pxstud.io/llms.txt.

### Image
Il modo veloce di lavorare pixel per pixel. app.getImage legge un cel (o una sua parte) in un'Image, un buffer di pixel che vive dentro lo script: img:getPixel e img:setPixel non escono mai dallo script, quindi un ciclo su ogni pixel di un cel di 512 x 512 richiede circa un decimo di secondo. app.putImage lo riscrive come un'unica modifica, qualunque sia il numero di pixel impostati. Un pixel è un intero impacchettato (app.pixelColor.rgba(r, g, b, a), come in Aseprite); setPixel accetta anche "#rrggbb[aa]" e { r, g, b, a } (l'alfa è 255 per impostazione predefinita). Negli sprite indicizzati img:getIndex e img:setIndex lavorano con gli indici della palette, così i colori duplicati restano distinti. Lo schema abituale: local img = app.getImage(layer, frame); for y = 0, img.height - 1 do for x = 0, img.width - 1 do img:setPixel(x, y, ...) end end; app.putImage(layer, frame, img).

#### `app.getCompositeImage(frameId, rect?)` — legge
Come appare un fotogramma, come Image RGBA: ogni livello visibile (immagine e tilemap) miscelato con la sua opacità e modalità di fusione, esattamente come viene esportato, su rect (per impostazione predefinita l'intera tela). I livelli di riferimento sono esclusi (non sono parte del disegno); fuori dalla tela si legge trasparente. Usala per verificare il risultato, o come sorgente per img:drawImage.

- `frameId` (string)
- `rect` (table, facoltativo) — L'area da leggere, { x, y, width, height } sulla tela (interi; width e height da 1 a 4096). Se omessa = l'intera tela.
  - `x` (integer) — Bordo sinistro.
  - `y` (integer) — Bordo superiore.
  - `width` (integer 1–4096) — Larghezza in pixel.
  - `height` (integer 1–4096) — Altezza in pixel.

Restituisce (image): Un'Image (vedi img:getPixel e gli altri metodi img:).

#### `app.getImage(layerId, frameId, rect?)` — legge
Legge il cel di un livello/fotogramma in un'Image: un buffer di pixel dentro lo script che leggi e modifichi con img:getPixel / img:setPixel (e img:getIndex / img:setIndex negli sprite indicizzati) senza alcun costo per chiamata, poi riscrivi con app.putImage come un'unica modifica. L'Image copre rect (per impostazione predefinita l'intera tela) e le sue coordinate partono da 0, 0 nell'angolo in alto a sinistra di rect; img.x, img.y ricordano dove si trova sulla tela, ed è lì che app.putImage la scrive per impostazione predefinita. I pixel senza cel si leggono trasparenti. Un cel collegato legge la sua immagine condivisa. Solo livelli immagine (immagini dei tile: app.getTilePixels).

- `layerId` (string)
- `frameId` (string)
- `rect` (table, facoltativo) — L'area da leggere, { x, y, width, height } sulla tela (interi; width e height da 1 a 4096). Se omessa = l'intera tela.
  - `x` (integer) — Bordo sinistro.
  - `y` (integer) — Bordo superiore.
  - `width` (integer 1–4096) — Larghezza in pixel.
  - `height` (integer 1–4096) — Altezza in pixel.

Restituisce (image): Un'Image (vedi img:getPixel e gli altri metodi img:).

#### `app.newImage(width, height, colorMode?)` — legge
Un'Image vuota (trasparente), in x = 0, y = 0: un buffer di lavoro in cui costruire i pixel prima di app.putImage, o da stampare su altre immagini con img:drawImage. Una indicizzata usa la palette dello sprite.

- `width` (number) — Da 1 a 4096.
- `height` (number) — Da 1 a 4096.
- `colorMode` (ColorMode: "rgba" | "grayscale" | "indexed", facoltativo) — Per impostazione predefinita quella dello sprite. "rgba" su uno sprite indicizzato dà un'immagine di lavoro a colori pieni (app.putImage ne mappa poi i colori sulla palette).

Restituisce (image): Un'Image (vedi img:getPixel e gli altri metodi img:).

#### `app.pixelColor.rgba(r, g, b, a?)` — pura
Impacchetta un colore in un intero di pixel, la forma che img:getPixel restituisce e che img:setPixel accetta più velocemente (come in Aseprite).

- `r` (number) — Da 0 a 255.
- `g` (number) — Da 0 a 255.
- `b` (number) — Da 0 a 255.
- `a` (number, facoltativo) — Da 0 a 255, predefinito 255.

Restituisce (number): r | g << 8 | b << 16 | a << 24.

#### `app.pixelColor.rgbaA(pixel)` — pura
L'alfa di un pixel impacchettato.

- `pixel` (number) — Un pixel impacchettato.

Restituisce (number): Da 0 a 255.

#### `app.pixelColor.rgbaB(pixel)` — pura
Il blu di un pixel impacchettato.

- `pixel` (number) — Un pixel impacchettato.

Restituisce (number): Da 0 a 255.

#### `app.pixelColor.rgbaG(pixel)` — pura
Il verde di un pixel impacchettato.

- `pixel` (number) — Un pixel impacchettato.

Restituisce (number): Da 0 a 255.

#### `app.pixelColor.rgbaR(pixel)` — pura
Il rosso di un pixel impacchettato.

- `pixel` (number) — Un pixel impacchettato.

Restituisce (number): Da 0 a 255.

#### `app.putImage(layerId, frameId, image, x?, y?)` — modifica, annullabile, rifiutata su un livello bloccato
Scrive un'Image nel cel di un livello/fotogramma: ogni pixel del rettangolo che copre viene sostituito (senza miscelazione), come un'unica modifica qualunque sia il numero di pixel impostati. Il cel si espande per contenerla e viene ritagliato sui suoi pixel visibili; ciò che cade fuori dalla tela viene scartato. Scrittura grezza: mai ritagliata sulla selezione né specchiata. In uno sprite indicizzato ogni pixel mantiene il proprio indice di palette (img:setIndex), a meno che nel frattempo la palette sia cambiata e quella voce non mostri più il colore del pixel; in uno sprite in scala di grigi i colori diventano grigi. Scrivere su un cel collegato modifica ogni fotogramma a cui è collegato.

- `layerId` (string)
- `frameId` (string)
- `image` (image) — L'Image da scrivere.
- `x` (number, facoltativo) — Dove cade il suo pixel in alto a sinistra; predefinito image.x (dove app.getImage l'ha letta, 0 per app.newImage).
- `y` (number, facoltativo) — Predefinito image.y.

Non restituisce nulla.

#### `img:clear(x?, y?, width?, height?)` — pura
Rende trasparente un rettangolo dell'immagine (per impostazione predefinita tutta) (l'indice trasparente nelle immagini indicizzate).

- `x` (number, facoltativo) — Predefinito 0.
- `y` (number, facoltativo) — Predefinito 0.
- `width` (number, facoltativo) — Predefinito fino al bordo destro.
- `height` (number, facoltativo) — Predefinito fino al bordo inferiore.

Non restituisce nulla.

#### `img:clone()` — pura
Una copia dell'immagine (stessa dimensione, posizione e modalità colore).

Restituisce (image): Una nuova Image.

#### `img:drawImage(image, x?, y?, opacity?, blendMode?)` — pura
Disegna un'altra Image su questa, miscelata come un livello (i suoi pixel trasparenti lasciano questa com'era). Da indicizzata a indicizzata a piena opacità copia gli indici.

- `image` (image) — L'Image da disegnare.
- `x` (number, facoltativo) — Dove cade il suo angolo in alto a sinistra; predefinito 0.
- `y` (number, facoltativo) — Predefinito 0.
- `opacity` (number, facoltativo) — Da 0 a 255, predefinito 255.
- `blendMode` (string, facoltativo) — Un BlendMode, predefinito "normal".

Non restituisce nulla.

#### `img:fill(color, x?, y?, width?, height?)` — pura
Riempie un rettangolo dell'immagine (per impostazione predefinita tutta) con un solo colore.

- `color` (color) — Un pixel impacchettato (app.pixelColor.rgba(r, g, b, a), ciò che restituisce img:getPixel), "#rrggbb[aa]" oppure { r, g, b, a } (a è 255 per impostazione predefinita).
- `x` (number, facoltativo) — Predefinito 0.
- `y` (number, facoltativo) — Predefinito 0.
- `width` (number, facoltativo) — Predefinito fino al bordo destro.
- `height` (number, facoltativo) — Predefinito fino al bordo inferiore.

Non restituisce nulla.

#### `img:getIndex(x, y)` — pura
Solo immagini indicizzate: l'indice di palette del pixel (da 0, nell'ordine di app.getPalette e app.setPaletteEntry), così i colori duplicati della palette si distinguono. Fuori dall'immagine: l'indice trasparente.

- `x` (number) — Colonna, 0 al bordo sinistro dell'immagine.
- `y` (number) — Riga, 0 in alto.

Restituisce (number): Da 0 a 255.

#### `img:getPixel(x, y)` — pura
Il colore di un pixel, impacchettato in un intero (la forma veloce: non viene creata alcuna tabella). In un'immagine indicizzata è il colore della palette corrispondente all'indice del pixel (trasparente per l'indice trasparente). Fuori dall'immagine: 0 (trasparente). x e y devono essere interi.

- `x` (number) — Colonna, 0 al bordo sinistro dell'immagine.
- `y` (number) — Riga, 0 in alto.

Restituisce (number): Il pixel impacchettato r | g << 8 | b << 16 | a << 24: scomponilo con app.pixelColor (o & 255, >> 8 ...).

#### `img:setIndex(x, y, index)` — pura
Solo immagini indicizzate: imposta esattamente l'indice di palette del pixel, anche su una di due voci con lo stesso colore (ciclo della palette, scambi di indici).

- `x` (number) — Colonna, 0 al bordo sinistro dell'immagine.
- `y` (number) — Riga, 0 in alto.
- `index` (number) — Un indice di palette, da 0.

Non restituisce nulla.

#### `img:setPixel(x, y, color)` — pura
Imposta il colore di un pixel. Accetta gli stessi colori dei comandi di disegno, più i pixel impacchettati, e rifiuta qualsiasi altra cosa ({ red = ... }, una lista, una stringa esadecimale errata) con un errore. In un'immagine indicizzata il colore diventa la voce di palette più vicina, mantenendo l'indice del pixel quando quella voce mostra già il colore (img:setIndex sceglie un indice esatto); in una in scala di grigi diventa grigio. Fuori dall'immagine non succede nulla.

- `x` (number) — Colonna, 0 al bordo sinistro dell'immagine.
- `y` (number) — Riga, 0 in alto.
- `color` (color) — Un pixel impacchettato (app.pixelColor.rgba(r, g, b, a), ciò che restituisce img:getPixel), "#rrggbb[aa]" oppure { r, g, b, a } (a è 255 per impostazione predefinita).

Non restituisce nulla.
