主要使用的是java.util.Robot類來捕獲屏幕,可以實現(xiàn)對屏幕一個矩形區(qū)域的捕獲,通過這個類,我們也可以實現(xiàn)一個遠程桌面控制的程序

Robot.createScreenCapture (Rectangle)

??1package?com.qiu.util;
??2import?java.io.*;
??3import?java.net.*;
??4import?javax.swing.*;
??5import?java.awt.*;
??6import?java.awt.event.*;
??7import?java.awt.image.*;
??8import?javax.imageio.*;
??9import?java.io.*;
?10
?11/**@Author?Qiu_BaiChao
?12?*一個簡單的屏幕抓圖
?13?*
?14?**/

?15?
?16public?class?ScreenCapture?{
?17?//test?main
?18?public?static?void?main(String[]?args)?throws?Exception{
?19??String?userdir?=?System.getProperty("user.dir");
?20??File?tempFile?=?new?File("d:","temp.png");?
?21??ScreenCapture?capture?=?ScreenCapture.getInstance();
?22??capture.captureImage();??
?23??JFrame?frame?=?new?JFrame();
?24??JPanel?panel?=?new?JPanel();
?25??panel.setLayout(new?BorderLayout());
?26??JLabel?imagebox?=?new?JLabel();
?27??panel.add(BorderLayout.CENTER,imagebox);??
?28??imagebox.setIcon(capture.getPickedIcon());
?29??capture.saveToFile(tempFile);
?30??capture.captureImage();
?31??imagebox.setIcon(capture.getPickedIcon());
?32??frame.setContentPane(panel);
?33??frame.setSize(400,300);
?34??frame.show();
?35??System.out.println("Over");
?36?}

?37?
?38?private?ScreenCapture()?{
?39??
?40??try{
?41???robot?=?new?Robot();
?42??}

?43??catch(AWTException?e)?{
?44???System.err.println("Internal?Error:?"?+?e);
?45???e.printStackTrace();
?46??}
??
?47??JPanel?cp?=?(JPanel)dialog.getContentPane();
?48??cp.setLayout(new?BorderLayout());??
?49??labFullScreenImage.addMouseListener(new?MouseAdapter()?{
?50????public?void?mouseReleased(MouseEvent?evn)?{
?51??????isFirstPoint?=?true;
?52??????pickedImage?=?fullScreenImage.getSubimage(recX,recY,recW,recH);
?53??????dialog.setVisible(false);?????
?54????}

?55???}
);
?56???
?57??labFullScreenImage.addMouseMotionListener(new?MouseMotionAdapter()?{
?58????public?void?mouseDragged(MouseEvent?evn)?{
?59?????if(isFirstPoint)?{
?60??????x1?=?evn.getX();
?61??????y1?=?evn.getY();
?62??????isFirstPoint?=?false;??
?63?????}

?64?????else?{
?65??????x2?=?evn.getX();
?66??????y2?=?evn.getY();
?67??????int?maxX?=?Math.max(x1,x2);
?68??????int?maxY?=?Math.max(y1,y2);
?69??????int?minX?=?Math.min(x1,x2);
?70??????int?minY?=?Math.min(y1,y2);
?71??????recX?=?minX;
?72??????recY?=?minY;
?73??????recW?=?maxX-minX;
?74??????recH?=?maxY-minY;
?75??????labFullScreenImage.drawRectangle(recX,recY,recW,recH);????
?76?????}

?77????}

?78????
?79????public?void?mouseMoved(MouseEvent?e)?{
?80?????labFullScreenImage.drawCross(e.getX(),e.getY());
?81????}

?82???}
);
?83???
?84??cp.add(BorderLayout.CENTER,labFullScreenImage);
?85??dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
?86??dialog.setAlwaysOnTop(true);
?87??dialog.setMaximumSize(
?88???Toolkit.getDefaultToolkit().getScreenSize());
?89??dialog.setUndecorated(true);
?90??dialog.setSize(dialog.getMaximumSize());
?91??dialog.setModal(true);
?92?}

?93?//Singleton?Pattern
?94?public?static?ScreenCapture?getInstance()?{
?95??return?defaultCapturer;
?96?}

?97?/**捕捉全屏慕*/
?98?public?Icon?captureFullScreen()?{
?99??fullScreenImage?=?robot.createScreenCapture(new?Rectangle(
100???Toolkit.getDefaultToolkit().getScreenSize()));
101??ImageIcon?icon?=?new?ImageIcon(fullScreenImage);
102??return?icon;
103?}

104?/**捕捉屏幕的一個矯形區(qū)域
105??*/

106?public?void?captureImage()?{
107??fullScreenImage?=?robot.createScreenCapture(new?Rectangle(
108???Toolkit.getDefaultToolkit().getScreenSize()));
109??ImageIcon?icon?=?new?ImageIcon(fullScreenImage);
110??labFullScreenImage.setIcon(icon);??
111??dialog.setVisible(true);?
112?}

113?/**得到捕捉后的BufferedImage*/?
114?public?BufferedImage?getPickedImage()?{
115??return?pickedImage;
116?}

117?/**得到捕捉后的Icon*/?
118?public?ImageIcon?getPickedIcon()?{
119??return?new?ImageIcon(getPickedImage());
120?}

121?/**儲存為一個文件,為PNG格式
122??*@deprecated
123??*replaced?by?saveAsPNG(File?file)
124??**/

125?@Deprecated
126?public?void?saveToFile(File?file)?throws?IOException{
127??ImageIO.write(getPickedImage(),defaultImageFormater,file);
128?}

129?/**儲存為一個文件,為PNG格式*/
130?public?void?saveAsPNG(File?file)?throws?IOException?{
131??ImageIO.write(getPickedImage(),"png",file);
132?}

133?/**儲存為一個JPEG格式圖像文件*/
134?public?void?saveAsJPEG(File?file)?throws?IOException?{
135??ImageIO.write(getPickedImage(),"JPEG",file);
136?}

137?
138?/**寫入一個OutputStream*/
139?public?void?write(OutputStream?out)?throws?IOException{
140??ImageIO.write(getPickedImage(),defaultImageFormater,out);
141?}

142?
143?//singleton?design?pattern
144?private?static?ScreenCapture?defaultCapturer?=?new?ScreenCapture();?
145?private?int?x1,y1,x2,y2;
146?private?int?recX,recY,recH,recW;?//截取的圖像
147?private?boolean?isFirstPoint??=?true;
148?private?BackgroundImage?labFullScreenImage?=?new?BackgroundImage();
149?private?Robot?robot;
150?private?BufferedImage?fullScreenImage;
151?private?BufferedImage?pickedImage;
152?private?String?defaultImageFormater?=?"png";
153?private?JDialog?dialog?=?new?JDialog();
154}

155
156/**顯示圖片的Label*/
157class?BackgroundImage?extends?JLabel{
158?public?void?paintComponent(Graphics?g)?{
159??super.paintComponent(g);
160??g.drawRect(x,y,w,h);
161??String?area?=?Integer.toString(w)+"?*?"+?Integer.toString(h);
162??g.drawString(area,x+(int)w/2-15,y+(int)h/2);
163??g.drawLine(lineX,0,lineX,getHeight());
164??g.drawLine(0,lineY,getWidth(),lineY);
165?}

166?
167?public?void?drawRectangle(int?x,int?y,int?width,int?height)?{
168??this.x?=?x;
169??this.y?=?y;
170??h?=?height;
171??w?=?width;
172??repaint();
173?}

174?
175?public?void?drawCross(int?x,int?y)?{
176??lineX?=?x;
177??lineY?=?y;
178??repaint();
179?}

180?
181?int?lineX,lineY;
182?int?x,y,h,w;
183}

184