Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

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=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).

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 MainWindow de 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 = 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

¿Te resultó útil esta página?