मुख्य सामग्री पर जाएँ
CrossFly 100% ओपन सोर्सGitHub पर फ़ॉलो करें
CrossFlyCrossFly
शुरू करें

यह पृष्ठ पुर्तगाली से मशीन-अनुवादित है और इसमें त्रुटियाँ हो सकती हैं। पुर्तगाली संस्करण प्रामाणिक है।

स्क्रीन का स्क्रीनशॉट कैसे कैप्चर करें

उद्देश्य। कुछ भी दोबारा पेंट किए बिना, स्क्रीन की वर्तमान सामग्री (OpenGL backbuffer) के साथ एक Image प्राप्त करें, और वैकल्पिक रूप से उसे सहेजें। निदान, दृश्य परीक्षण और साझा करने के लिए उपयोगी।

उपयोग की गई APIs

  • static Image Main.getScreenShot(boolean... opaque) — वर्तमान फ़्रेम को कैप्चर करता है। opaque=true अल्फा चैनल हटा देता है (सब कुछ अपारदर्शी बना देता है)। यह सबसे आम स्थैतिक सुविधा है। आंतरिक रूप से यह runOnPaintThreadAndWait के माध्यम से paint thread पर इंस्टेंस संस्करण को कॉल करता है।
  • Image Main.getScreenShot(boolean opaque) (इंस्टेंस) — वही कैप्चर; पढ़ने को paint thread पर शेड्यूल करता है और समाप्त होने तक ब्लॉक करता है।
  • Image Main.getNextScreenShot(boolean opaque) (इंस्टेंस) — दोबारा पेंटिंग को बाध्य करता है और अगले फ़्रेम को कैप्चर करता है। इसका उपयोग तब करें जब आपने अभी-अभी UI बदला हो और सुनिश्चित करना चाहते हों कि बदलाव स्क्रीनशॉट में दिखे; यदि paint thread के बाहर से कॉल किया जाए, तो यह फ़्रेम प्राप्त होने तक लूप में दोबारा पेंट/अपडेट करता है।
  • String Image.toPng(String... prefix) / String Image.toJpg(int... quality) — परिणाम को सहेजने के लिए (देखें salvar-imagem.md)।

पूर्ण उदाहरण (कॉपी करें, पेस्ट करें और चलाएँ)

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

/** चलाने योग्य मुख्य स्क्रीन। launcher (classname) की ओर संकेत करें और चलाएँ: 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 ->
      {
         // वर्तमान फ़्रेम को कैप्चर करता है, अपारदर्शी (बिना alpha), और एक PNG सहेजता है:
         Image shot = Main.getScreenShot(true);   // true = alpha हटाता है
         String path = shot.toPng("screen_");     // उदा.: .../screen_20260706153000.png
         Debug.log("Screenshot salvo em: " + path);

         // यदि आपने अभी UI बदला है और अगला रेंडर किया गया फ़्रेम चाहते हैं:
         Image next = Main.instance.getNextScreenShot(false);  // alpha बनाए रखता है
      });
      add(LAY_AUTO, b);
   }
}

नीचे दिया गया अंश केवल मुख्य भाग दिखाता है। चलाने के लिए, इसे ऊपर दिए गए MainWindow ढांचे में रखें।

न्यूनतम अंश

// स्रोत में सत्यापित: Main.java getScreenShot (533, 667) और getNextScreenShot (541)
import dev.crossfly.Main;
import dev.crossfly.ui.image.Image;

// वर्तमान फ़्रेम को कैप्चर करता है, अपारदर्शी (बिना alpha), और एक PNG सहेजता है:
Image shot = Main.getScreenShot(true);   // true = alpha हटाता है
String path = shot.toPng("screen_");     // उदा.: .../screen_20260706153000.png

// यदि आपने अभी UI बदला है और अगला रेंडर किया गया फ़्रेम चाहते हैं:
Image next = Main.instance.getNextScreenShot(false);  // alpha बनाए रखता है

कार्यान्वयन नोट्स (स्रोत):

  • कैप्चर की गई छवि में alreadyScreenScaled = true होता है और उस पर flipY() लागू होता है (OpenGL backbuffer लंबवत रूप से उलटा आता है)।
  • WebGL प्लेटफ़ॉर्म पर, opaque=true setOpaque() लागू नहीं करता (कोड में स्पष्ट गार्ड); अपारदर्शी माँगने पर भी अल्फा बना रहता है।
  • getScreenShot, Component.toImage() से भिन्न है: यहाँ कोई पेंटिंग/रेंडर नहीं होता — वर्तमान फ़्रेम का backbuffer कैप्चर किया जाता है।
  • क्रॉस-प्लेटफ़ॉर्म तुलनाओं के लिए (उदा.: परीक्षण), Styles.setDefaultFont(Font.getFont(false, 20)) के साथ फ़ॉन्ट को तय करें, क्योंकि फ़ॉन्ट रेंडरिंग डिवाइस के अनुसार भिन्न होती है।

और गहराई से जानें

क्या यह पृष्ठ उपयोगी था?