使用Java捕获和显示图像

时间:2012-08-21 23:10:16

标签: java image swing jlabel

这是我第一次用Java编写代码,所以请跟我一起打电话。 :P
我想创建一个捕获屏幕(1280x720 res)然后显示它的应用程序。这个代码是在一个while循环中,所以它正在进行中。这就是我所拥有的:

import javax.swing.*;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;

public class SV1 {

    public static void main(String[] args) throws Exception {
        JFrame theGUI = new JFrame();
        theGUI.setTitle("TestApp");
        theGUI.setSize(1280, 720);
        theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theGUI.setVisible(true);

        Robot robot = new Robot();

        while (true) {
            BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));

            JLabel picLabel = new JLabel(new ImageIcon( screenShot ));
            theGUI.add(picLabel);
        }
    }
}

我从this answer想出了这一点,但它并不适合我想要的东西。首先,由于某些原因我不确定,它会导致java耗尽内存“Java堆空间”。其次,由于未更新显示的图像,因此无法正常工作。

我读过有关使用Graphics(java.awt.Graphics)绘制图像的内容。有人能告诉我这个例子吗?或者,如果有更好的方法,或许可以指出我正确的方向?谢谢您的帮助。 :)

1 个答案:

答案 0 :(得分:3)

  

它导致java耗尽内存“Java堆空间”

您正在永远循环并不断向您的JFrame添加新的JLabel。 您可以尝试而不是每次重新创建JLabel,只需设置一个新的ImageIcon:

JLabel picLabel = new JLabel();
theGUI.add(picLabel);
while (true) 
{
    BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));
    picLabel.setIcon(new ImageIcon(screenShot));   

}

如果你想使用Graphics绘画(在这种情况下它可能是一个更好的主意),你可以扩展JLabel并覆盖paintComponent方法,在其中绘制图像:< / p>

public class ScreenShotPanel extends JLabel
{

    @override
    public void paintComponent(Graphics g) {
        BufferedImage screenShot = robot.createScreenCapture(new Rectangle(1280,720));
        g.drawImage(screenShot,0,0,this);
    }
}