Сохранить содержимое JFrame как .png - PullRequest
2 голосов
/ 19 мая 2019

Я сейчас занимаюсь разработкой 2D-игры на Java (я использую JFrame). Я хотел бы, чтобы при нажатии определенной кнопки сохранялось содержимое фрейма и сохраняло его в изображении. На данный момент я использую следующий код:

Robot robot = new Robot();
Rectangle screenSize = new Rectangle(display.getFrame().getX() + 3, display.getFrame().getY() + 26, handler.getWidth(), handler.getHeight());

BufferedImage screenShot = robot.createScreenCapture(screenSize);   ImageIO.write(screenShot,File("D:\\Programming\\First2DGame\\res\\textures\\Screenshot.png"));

Проблема в том, что это снимок экрана части экрана , а не самой рамки . Это означает, что, если, например, я переместлю свое окно в нижний правый угол экрана, я получу уведомление о несоответствии, а затем нажму кнопку, уведомление будет присутствовать на снимке экрана.

Я уже немного искал, я попробовал этот код:

 try
        {
            BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics2D = image.createGraphics();
            frame.paint(graphics2D);
            ImageIO.write(image,"jpeg", new File("D:\\Programming\\First2DGame\\res\\textures\\Screenshot.png"));
        }
        catch(Exception e)
        {
            e.printStackTrace;
        }
    }

    protected void paintComponent(Graphics g)
    {
        g.drawRect(50,50,50,50);
    }

но в результате получается белое окно:

you can see it here

Возможно, вы знаете, как создать скриншот из только рамки ?

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Я думаю, что пример кода, который вы показали, в значительной степени правильный ...Можете ли вы проверить это с кодом ниже?: D Если убрать contentPane.printAll(g2d) Как вы показали, только белое окно

public class ImageSaveTest extends JFrame {

    public static void main(String[] args) {
        new ImageSaveTest();
    }

    public ImageSaveTest() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 300));
        panel.setLayout(new GridBagLayout());

        JLabel label = new JLabel("Hello! StackOverflow(Press Enter)");
        label.setFont(new Font("Default", Font.BOLD, 15));

        panel.add(label);
        add(panel);
        setVisible(true);
        pack();

        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyCode());
                if(e.getKeyCode() == KeyEvent.VK_ENTER) {
                    try {
                        Container contentPane = getContentPane();
                        BufferedImage image = new BufferedImage(contentPane.getWidth(), contentPane.getHeight(),
                                BufferedImage.TYPE_INT_RGB);
                        Graphics2D g2d = image.createGraphics();
                        contentPane.printAll(g2d);
                        g2d.dispose();

                        // replace this path to your image
                        ImageIO.write(image, "jpeg", new File("Your Path/Print.png"));
                    } catch (IOException ex) {
                        // Exception Handling
                    }
                }
            }
        });
    }
}
0 голосов
/ 19 июня 2019

Вот мой код (я знаю, он довольно длинный):


package dev.patatonzolo.first2Dgame;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import dev.patatonzolo.first2Dgame.display.Display;
import dev.patatonzolo.first2Dgame.gfx.Assets;
import dev.patatonzolo.first2Dgame.gfx.GameCamera;
import dev.patatonzolo.first2Dgame.playerInput.KeyManager;
import dev.patatonzolo.first2Dgame.playerInput.MouseInput;
import dev.patatonzolo.first2Dgame.ppes.GaussianBlur;
import dev.patatonzolo.first2Dgame.states.GameState;
import dev.patatonzolo.first2Dgame.states.IgMenuState;
import dev.patatonzolo.first2Dgame.states.MainMenuState;
import dev.patatonzolo.first2Dgame.states.OpeningState;
import dev.patatonzolo.first2Dgame.states.OptionsState;
import dev.patatonzolo.first2Dgame.states.QuitState;
import dev.patatonzolo.first2Dgame.states.State;

public class Game extends JPanel implements Runnable {

    private Display display;
    private int width;
    private int height;
    public String title;
    protected int ticks = 0;

    private Thread thread;

    private boolean running = false;
    private BufferStrategy bufferStrategy;
    private Graphics2D graphics2d;

    public State gameState;
    public State openingState;
    public State igMenuState;
    public State mainMenuState;
    public State optionsState;
    public State quitState;

    private KeyManager keyManager;
    private MouseInput mouseInput;

    private GameCamera gameCamera;

    private Handler handler;


    public Game(String title, int width, int height) {
        this.width = width;
        this.height = height;
        this.title = title;
        keyManager = new KeyManager();
        mouseInput = new MouseInput();
    }

    private void takeScreenshot() {
        try {
        Container contentPane = display.getFrame().getContentPane();
        BufferedImage image = new BufferedImage(contentPane.getWidth(), contentPane.getHeight(),
                BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        contentPane.printAll(g2d);
        g2d.dispose();

        ImageIO.write(image, "png", new File("C:\\Users\\VgRig\\eclipse-workspace\\First2DGame\\res\\textures\\screenshot.png"));
    } catch (IOException e) {
        e.printStackTrace();
        }
    }

    @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;

      }

    private void init() {
        display = new Display(title, width, height);
        display.getFrame().addKeyListener(keyManager);
        display.getFrame().addMouseListener(mouseInput);
        display.getFrame().addMouseMotionListener(mouseInput);
        display.getCanvas().addMouseListener(mouseInput);
        display.getCanvas().addMouseMotionListener(mouseInput);
        Assets.init();

        handler = new Handler(this);
        gameCamera = new GameCamera(handler, 0, 0);
        gameState = new GameState(handler);
        openingState = new OpeningState(handler);
        igMenuState = new IgMenuState(handler);
        mainMenuState = new MainMenuState(handler);
        optionsState = new OptionsState(handler);
        quitState = new QuitState(handler);
        State.setState(gameState);

    }

    public void update() {
        keyManager.update();
        mouseInput.update();
        if(State.getState() != null) {
            State.getState().update();
        }

        if(handler.getKeyManager().right) {
        }

        // MENUS 
        if(handler.getKeyManager().menu) {
            takeScreenshot();
            //GaussianBlur.Blur();
            State.setState(igMenuState);
        }
        if(State.getState() == gameState && handler.getKeyManager().menu) {
            State.setState(gameState);
        }

        if(State.getState() != igMenuState) {
            IgMenuState.currentSelection = 4;
        }
        if(State.getState() != quitState) {
            QuitState.currentSelection = 2;
        }

    }

    private void render() {
        bufferStrategy = display.getCanvas().getBufferStrategy();
        if(bufferStrategy == null) {
            display.getCanvas().createBufferStrategy(3);
            return;
        }
        graphics2d = (Graphics2D) bufferStrategy.getDrawGraphics();
        graphics2d.clearRect(0, 0, width, height);

        if(State.getState() != null) {
            State.getState().render(graphics2d);
        }

        bufferStrategy.show();
        graphics2d.dispose();

    }

    public void run() { 
        init();

        int fps = 60;
        double timePerTick = 1000000000 / fps;
        double delta = 0;
        long now;
        long lastTime = System.nanoTime();
        long framePerSecond = 0;

        while(running) {
            now = System.nanoTime();
            delta += (now - lastTime) / timePerTick;
            framePerSecond += now - lastTime;
            lastTime = now;

            if(delta >= 1) {
                update();
                render();
                ticks ++;
                delta --;
            }

            if(framePerSecond >= 1000000000) {
                System.out.println("Game running at [" + ticks + " FPS]");
                ticks = 0;
                framePerSecond = 0;
            }
        }       

        stop();
    }

    public int getTicks() {
        return ticks;
    }

    public void setTicks(int ticks) {
        this.ticks = ticks;
    }

    public KeyManager getKeyManager() {
        return keyManager;
    }

    public MouseInput getMouseInput() {
        return mouseInput;
    }

    public GameCamera getGameCamera() {
        return gameCamera;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public synchronized void start() {
        if(running)
            return;
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public synchronized void stop() {
        if(running = false)
            return;
        running = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}
0 голосов
/ 24 мая 2019

[Обновить] (в случае, если у кого-то есть такая же проблема: 3) Я провел небольшое исследование, и, как я и предполагал, решение состоит в том, что я должен рендерить все, переопределив метод paintComponent () в JFrame (I).предположим).На данный момент я не знаю, как это сделать, но думаю, что смогу это исправить.Я буду очень занят в предстоящие дни, но я скажу вам, когда у меня все заработает!=) * * Тысяча одна

...