java - 如何将屏幕捕获为图像,将其绘制在 GUI 的组件上并在某些区域绘制框?

标签 java swing user-interface drawing awt

我正在使用以下示例截取屏幕截图:

try {
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 200, 200));
} catch java.awt.AWTException exc) {
    System.out.println("error: main");
}

现在我想在 GUI 的组件上绘制屏幕截图。我不知道应该使用哪个组件,但我想每帧绘制图像(需要 20 FPS),它看起来像一部电影,一个拍摄我桌面的相机。而且,我想在绘制区域的某些区域上绘制方框。

我怎样才能做到这一点?我看到的每个示例都执行以下操作:

  • 在程序启动时从文件系统加载图像,并且 被 JPanel 所吸引,因此无法轻易在其上绘画 我想这样做。

这不起作用(灰色面板):

visualization = new JPanel();
visualization.setLayout(new BorderLayout());
try {
        Robot robot = new Robot();
        BufferedImage image = robot.createScreenCapture(new Rectangle(0, 0, 200, 200));
        Graphics2D g = image.createGraphics();
        visualization.paint(g);
        visualization.setVisible(true);

    }
    catch(java.awt.AWTException exc) {
        System.out.println("error: main");
    }

最佳答案

据我所知,最好的方法是将图像设置为 IconJLabel ,简单的例子

import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;

public class CaptureScreen implements ActionListener {

    private JFrame f = new JFrame("Screen Capture");
    private JPanel pane = new JPanel();
    private JButton capture = new JButton("Capture");
    private JDialog d = new JDialog();
    private JScrollPane scrollPane = new JScrollPane();
    private JLabel l = new JLabel();
    private Point location;

    public CaptureScreen() {
        capture.setActionCommand("CaptureScreen");
        capture.setFocusPainted(false);
        capture.addActionListener(this);
        capture.setPreferredSize(new Dimension(300, 50));
        pane.add(capture);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(pane);
        f.setLocation(100, 100);
        f.pack();
        f.setVisible(true);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                createPicContainer();
            }
        });
    }

    private void createPicContainer() {
        l.setPreferredSize(new Dimension(700, 500));
        scrollPane = new JScrollPane(l,
                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setBackground(Color.white);
        scrollPane.getViewport().setBackground(Color.white);
        d.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        d.add(scrollPane);
        d.pack();
        d.setVisible(false);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("CaptureScreen")) {
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); // gets the screen size
            Robot r;
            BufferedImage bI;
            try {
                r = new Robot(); // creates robot not sure exactly how it works
                Thread.sleep(1000); // waits 1 second before capture
                bI = r.createScreenCapture(new Rectangle(d)); // tells robot to capture the screen
                showPic(bI);
                saveImage(bI);
            } catch (AWTException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                e2.printStackTrace();
            }
        }
    }

    private void saveImage(BufferedImage bI) {
        try {
            ImageIO.write(bI, "JPG", new File("screenShot.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void showPic(BufferedImage bI) {
        ImageIcon pic = new ImageIcon(bI);
        l.setIcon(pic);
        l.revalidate();
        l.repaint();
        d.setVisible(false);
        location = f.getLocationOnScreen();
        int x = location.x;
        int y = location.y;
        d.setLocation(x, y + f.getHeight());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                d.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                CaptureScreen cs = new CaptureScreen();
            }
        });
    }
}

关于java - 如何将屏幕捕获为图像,将其绘制在 GUI 的组件上并在某些区域绘制框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8532452/

相关文章:

java - JEdi​​torPane 中的 HTMLEditorKit 和自定义标签

java - 如何将一副纸牌分成两半?

Java 图形用户界面验证

java - 复杂的按钮布局

java - Java 中预期 XSL-FO 设计器的 UI

jquery - 如何获取 JQuery UI 选项卡插件中默认加载的选项卡文本?

css - 重置 CSS box-sizing : universal selector vs . 框类

java - Spring 表单映射到数组

java - 我无法从 AbstractAction 内部类中声明的 actionPerformed 设置不可见的 JFrame,如何解决?

java - 如何将大型依赖树从 Maven Central 推送到本地 Archiva 服务器?