主要使用的是java.util.Robot類來捕獲屏幕,可以實現(xiàn)對屏幕一個矩形區(qū)域的捕獲,通過這個類,我們也可以實現(xiàn)一個遠(yuǎn)程桌面控制的程序
Robot.createScreenCapture (Rectangle)
Robot.createScreenCapture (Rectangle)
??1
package?com.qiu.util;
??2
import?java.io.*;
??3
import?java.net.*;
??4
import?javax.swing.*;
??5
import?java.awt.*;
??6
import?java.awt.event.*;
??7
import?java.awt.image.*;
??8
import?javax.imageio.*;
??9
import?java.io.*;
?10
?11
/**?*//**@Author?Qiu_BaiChao
?12
?*一個簡單的屏幕抓圖
?13
?*
?14
?**/
?15
?
?16
public?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*/
157
class?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

??2

??3

??4

??5

??6

??7

??8

??9

?10

?11


?12

?13

?14

?15

?16



?17

?18



?19

?20

?21

?22

?23

?24

?25

?26

?27

?28

?29

?30

?31

?32

?33

?34

?35

?36

?37

?38



?39

?40



?41

?42

?43



?44

?45

?46

?47

?48

?49



?50



?51

?52

?53

?54

?55

?56

?57



?58



?59



?60

?61

?62

?63

?64



?65

?66

?67

?68

?69

?70

?71

?72

?73

?74

?75

?76

?77

?78

?79



?80

?81

?82

?83

?84

?85

?86

?87

?88

?89

?90

?91

?92

?93

?94



?95

?96

?97


?98



?99

100

101

102

103

104


105

106



107

108

109

110

111

112

113


114



115

116

117


118



119

120

121


122

123

124

125

126



127

128

129


130



131

132

133


134



135

136

137

138


139



140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156


157



158



159

160

161

162

163

164

165

166

167



168

169

170

171

172

173

174

175



176

177

178

179

180

181

182

183

184
