簡體   English   中英

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

[英]Java screenshot (using Robot and BufferedImage.getRGB)

我昨天發現了機器人課,並認為這很酷。 今天我想嘗試一下,看看有什么可能; 所以我決定制作一個截取整個屏幕截圖的程序,並在JPanel上逐個像素地渲染出一個圖像。 我已完成程序(兩個類),但它不起作用,我找不到原因(我已經查看了幾次代碼)。 這是代碼:

(第一類)

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();
            }
        }
    }
}

我搜索了這個問題無濟於事。

誰能告訴我我做錯了什么?

為了使它工作,只需使用以下內容替換類Two paintComponent()方法:

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

你也可以擺脫doRender()方法。

Two應該是顯示screenCapJLabel的實例。 例如

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渲染ImageIcon

每次重新繪制時,在整個面板上繪制白色,然后只繪制一個像素。 所以在每一個之后,你只會得到一個像素。 也沒有必要多次調用repaint 實際上,當您調用repaint ,它不會立即實際調用paintComponent 它只是提交一個重繪的請求,最終會做什么。 它可能不是一對一的。 例如,許多repaint調用可能只會調用paintComponent 您應該嘗試編寫代碼,以便對paintComponent的單個調用將完全顯示該組件。

為此,您可以使用g.drawImage顯示BufferedImage。 有關在JPanel中顯示圖像的更多信息,請參閱文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM