Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
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=trueelimina 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íarunOnPaintThreadAndWait.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).
Ejemplo completo (copiar, pegar y ejecutar)
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
MainWindowde arriba.
Fragmento mínimo
// 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 = truey sufreflipY()(el backbuffer OpenGL viene invertido verticalmente).- En la plataforma WebGL,
opaque=trueno aplicasetOpaque()(guarda explícita en el código); el alfa se mantiene aunque se pida opaco.getScreenShotdifiere deComponent.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 — graba la captura en PNG/JPEG.
- Dibujo personalizado — paint thread y
runOnPaintThreadAndWait.
¿Te resultó útil esta página?¡Gracias por tu opinión!