# Cómo capturar una captura de pantalla

> Capturar el backbuffer actual como una Image con Main.getScreenShot y guardarla.

Source: https://crossfly.dev/es/docs/cookbook/images/screenshot — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Cómo capturar una captura de pantalla

**Propósito.** Obtener una `Image` con el contenido actual de la pantalla (el backbuffer OpenGL), sin repintar
nada, y opcionalmente guardarla. Útil para diagnóstico, pruebas visuales y compartir.

## APIs usadas
- `static Image Main.getScreenShot(boolean... opaque)` — captura el **cuadro actual**. `opaque=true` elimina el canal alfa (vuelve todo opaco). Es la conveniencia estática más común. Internamente llama a la versión de instancia en la paint thread vía `runOnPaintThreadAndWait`.
- `Image Main.getScreenShot(boolean opaque)` (instancia) — misma captura; agenda la lectura en la paint thread y bloquea hasta terminar.
- `Image Main.getNextScreenShot(boolean opaque)` (instancia) — fuerza el repintado y captura el **siguiente** cuadro. Úsalo cuando acabas de cambiar la UI y quieres asegurar que el cambio aparezca en la captura; si se llama fuera de la paint thread, repinta/actualiza en bucle hasta obtener el cuadro.
- `String Image.toPng(String... prefix)` / `String Image.toJpg(int... quality)` — para guardar el resultado (ver [salvar-imagem.md](/docs/cookbook/images/salvar-imagem)).

## Ejemplo completo (copiar, pegar y ejecutar)

```java
package com.exemplo;

import dev.crossfly.*;                        // Main
import dev.crossfly.ui.*;                     // Window, Button
import dev.crossfly.ui.layout.*;             // VerticalLayout, LAY_AUTO
import dev.crossfly.ui.image.*;              // Image
import dev.crossfly.util.*;                  // Debug

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Button b = new Button("Capturar tela");
      b.onAction(origin ->
      {
         // Captura el cuadro actual, opaco (sin alpha), y guarda un PNG:
         Image shot = Main.getScreenShot(true);   // true = quita alpha
         String path = shot.toPng("screen_");     // ej.: .../screen_20260706153000.png
         Debug.log("Screenshot salvo em: " + path);

         // Si acabas de cambiar la UI y quieres el PRÓXIMO cuadro renderizado:
         Image next = Main.instance.getNextScreenShot(false);  // mantiene alpha
      });
      add(LAY_AUTO, b);
   }
}
```

> El fragmento de abajo muestra **solo el núcleo**. Para ejecutarlo, colócalo en el esqueleto `MainWindow` de arriba.

## Fragmento mínimo

```java
// verificado en la fuente: Main.java getScreenShot (533, 667) y getNextScreenShot (541)
import dev.crossfly.Main;
import dev.crossfly.ui.image.Image;

// Captura el cuadro actual, opaco (sin alpha), y guarda un PNG:
Image shot = Main.getScreenShot(true);   // true = quita alpha
String path = shot.toPng("screen_");     // ej.: .../screen_20260706153000.png

// Si acabas de cambiar la UI y quieres el PRÓXIMO cuadro renderizado:
Image next = Main.instance.getNextScreenShot(false);  // mantiene alpha
```

> Notas de implementación (fuente):
> - La imagen capturada tiene `alreadyScreenScaled = true` y sufre `flipY()` (el backbuffer OpenGL viene
>   invertido verticalmente).
> - En la plataforma **WebGL**, `opaque=true` **no** aplica `setOpaque()` (guarda explícita en el código);
>   el alfa se mantiene aunque se pida opaco.
> - `getScreenShot` difiere de `Component.toImage()`: aquí **no** hay pintura/render — se captura el
>   backbuffer del cuadro actual.
> - Para comparaciones cross-platform (ej.: pruebas), fija la fuente con
>   `Styles.setDefaultFont(Font.getFont(false, 20))`, ya que el renderizado de fuentes varía según el dispositivo.

## Profundiza
- Receta hermana: [salvar-imagem.md](/docs/cookbook/images/salvar-imagem) — graba la captura en PNG/JPEG.
- [Dibujo personalizado](/docs/ui/images-and-graphics/custom-drawing) — paint thread y `runOnPaintThreadAndWait`.
