packagecom.qiu.util;
importjava.io.*;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.awt.image.*;
importjavax.imageio.*;
/**
* 一个简单的屏幕抓图
*
**/
publicclassScreenCapture {
// test main
publicstaticvoidmain(String[] args)throwsException {
String userdir = System.getProperty("user.dir");
File tempFile =newFile("d:","temp.png");
ScreenCapture capture = ScreenCapture.getInstance();
capture.captureImage();
JFrame frame =newJFrame();
JPanel panel =newJPanel();
panel.setLayout(newBorderLayout());
JLabel imagebox =newJLabel();
panel.add(BorderLayout.CENTER, imagebox);
imagebox.setIcon(capture.getPickedIcon());
capture.saveToFile(tempFile);
capture.captureImage();
imagebox.setIcon(capture.getPickedIcon());
frame.setContentPane(panel);
frame.setSize(400,300);
frame.show();
System.out.println("Over");
}
privateScreenCapture() {
try{
robot =newRobot();
}catch(AWTException e) {
System.err.println("Internal Error: "+ e);
e.printStackTrace();
}
JPanel cp = (JPanel) dialog.getContentPane();
cp.setLayout(newBorderLayout());
labFullScreenImage.addMouseListener(newMouseAdapter() {
publicvoidmouseReleased(MouseEvent evn) {
isFirstPoint =true;
pickedImage = fullScreenImage.getSubimage(recX, recY, recW,
recH);
dialog.setVisible(false);
}
});
labFullScreenImage.addMouseMotionListener(newMouseMotionAdapter() {
publicvoidmouseDragged(MouseEvent evn) {
if(isFirstPoint) {
x1 = evn.getX();
y1 = evn.getY();
isFirstPoint =false;
}else{
x2 = evn.getX();
y2 = evn.getY();
intmaxX = Math.max(x1, x2);
intmaxY = Math.max(y1, y2);
intminX = Math.min(x1, x2);
intminY = Math.min(y1, y2);
recX = minX;
recY = minY;
recW = maxX - minX;
recH = maxY - minY;
labFullScreenImage.drawRectangle(recX, recY, recW, recH);
}
}
publicvoidmouseMoved(MouseEvent e) {
labFullScreenImage.drawCross(e.getX(), e.getY());
}
});
cp.add(BorderLayout.CENTER, labFullScreenImage);
dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
dialog.setAlwaysOnTop(true);
dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());
dialog.setUndecorated(true);
dialog.setSize(dialog.getMaximumSize());
dialog.setModal(true);
}
// Singleton Pattern
publicstaticScreenCapture getInstance() {
returndefaultCapturer;
}
/** 捕捉全屏慕 */
publicIcon captureFullScreen() {
fullScreenImage = robot.createScreenCapture(newRectangle(Toolkit
.getDefaultToolkit().getScreenSize()));
ImageIcon icon =newImageIcon(fullScreenImage);
returnicon;
}
/** 捕捉屏幕的一个矫形区域 */
publicvoidcaptureImage() {
fullScreenImage = robot.createScreenCapture(newRectangle(Toolkit
.getDefaultToolkit().getScreenSize()));
ImageIcon icon =newImageIcon(fullScreenImage);
labFullScreenImage.setIcon(icon);
dialog.setVisible(true);
}
/** 得到捕捉后的BufferedImage */
publicBufferedImage getPickedImage() {
returnpickedImage;
}
/** 得到捕捉后的Icon */
publicImageIcon getPickedIcon() {
returnnewImageIcon(getPickedImage());
}
/**
* 储存为一个文件,为PNG格式
*
* @deprecated replaced by saveAsPNG(File file)
**/
@Deprecated
publicvoidsaveToFile(File file)throwsIOException {
ImageIO.write(getPickedImage(), defaultImageFormater, file);
}
/** 储存为一个文件,为PNG格式 */
publicvoidsaveAsPNG(File file)throwsIOException {
ImageIO.write(getPickedImage(),"png", file);
}
/** 储存为一个JPEG格式图像文件 */
publicvoidsaveAsJPEG(File file)throwsIOException {
ImageIO.write(getPickedImage(),"JPEG", file);
}
/** 写入一个OutputStream */
publicvoidwrite(OutputStream out)throwsIOException {
ImageIO.write(getPickedImage(), defaultImageFormater, out);
}
// singleton design pattern
privatestaticScreenCapture defaultCapturer =newScreenCapture();
privateintx1, y1, x2, y2;
privateintrecX, recY, recH, recW;// 截取的图像
privatebooleanisFirstPoint =true;
privateBackgroundImage labFullScreenImage =newBackgroundImage();
privateRobot robot;
privateBufferedImage fullScreenImage;
privateBufferedImage pickedImage;
privateString defaultImageFormater ="png";
privateJDialog dialog =newJDialog();
}
/** 显示图片的Label */
classBackgroundImageextendsJLabel {
publicvoidpaintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(x, y, w, h);
String area = Integer.toString(w) +" * "+ Integer.toString(h);
g.drawString(area, x + (int) w /2-15, y + (int) h /2);
g.drawLine(lineX,0, lineX, getHeight());
g.drawLine(0, lineY, getWidth(), lineY);
}
publicvoiddrawRectangle(intx,inty,intwidth,intheight) {
this.x = x;
this.y = y;
h = height;
w = width;
repaint();
}
publicvoiddrawCross(intx,inty) {
lineX = x;
lineY = y;
repaint();
}
intlineX, lineY;
intx, y, h, w;
}