[英]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
應該是顯示screenCap
的JLabel
的實例。 例如
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.