Java截图(使用Robot和BufferedImage.getRGB)

时间:2012-09-10 18:03:17

标签: java pixel bufferedimage awtrobot

我昨天发现了机器人课程,并认为这很酷。今天我想尝试一下,看看有什么可能;所以我决定制作一个截取整个屏幕截图的程序,并在JPanel上逐个像素地渲染出一个图像。我已完成程序(两个类),但它不起作用,我找不到原因(我已经查看了几次代码)。这是代码:

(FIRST CLASS)

import java.awt.AWTException;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class One { 
    public static void main(String[] args) { 
        BufferedImage screenCap = null;
        Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        try {
            screenCap = new Robot().createScreenCapture(screenRect);
            Two imageRenderer = new Two(screenCap, screenRect);
            imageRenderer.doRender();
            JFrame frame = new JFrame();
            frame.setVisible(true);
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
            frame.add(imageRenderer);
            frame.pack();
        } catch (AWTException e) { 
            e.printStackTrace(); 
        } 
    } 
}

(第二类)

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class Two extends JPanel {
    private BufferedImage screenCap;
    private Rectangle screenRect;

    private Color pixelRGB;
    //c1 and c2 are the x and y co-ordinates of the selected pixel.
    private int c1, c2;

    public Two(BufferedImage sC, Rectangle rect) {
        screenCap = sC;
        screenRect = rect;
        setPreferredSize(new Dimension(rect.width, rect.height));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.WHITE);

        g.setColor(pixelRGB);
        g.drawRect(c1, c2, 1, 1);
    }

    public void doRender() {
        for(int i=0; i<screenRect.width; i++) {
            for(int j=0; j<screenRect.height; j++) {
                pixelRGB = new Color(screenCap.getRGB(i, j));
                c1 = i;
                c2 = j;
                repaint();
            }
        }
    }
}

我用Google搜索这个问题无济于事。

谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:3)

为了使其有效,只需使用以下内容替换班级paintComponent()中的Two方法:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    setBackground(Color.WHITE);
    g.drawImage(screenCap, 0, 0, getWidth(), getHeight(), null);
}

您也可以摆脱doRender()方法。

答案 1 :(得分:1)

Two应该是显示JLabel的{​​{1}}的实例。 E.G。

screenCap

如果您希望对它真的很整洁,请将其放在滚动窗格中。电池不包括在内。

如果不明显:import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; public class Screenshot { public static void main(String[] args) throws Exception { Rectangle screenRect = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize()); final BufferedImage screenCap = new Robot().createScreenCapture(screenRect); Runnable r = new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, new ImageIcon(screenCap)); } }; SwingUtilities.invokeLater(r); } } 使用JOptionPane呈现JLabel

答案 2 :(得分:0)

每次重绘时,在整个面板上涂上白色,然后只做一个像素。所以在每一个之后,你只会得到一个像素。也没有必要多次致电repaint。实际上,当您拨打repaint时,它并不会立即实际呼叫paintComponent。它只是提交一个重绘的请求,最终会做什么。它可能不是一对一的。例如,对repaint的多次调用可能只会调用paintComponent。您应该尝试编写代码,以便对paintComponent的单个调用将完全显示该组件。

为此,您可以使用g.drawImage显示BufferedImage。有关在JPanel中显示图像的详细信息,请参阅this帖子。