Java實現截圖並保存到本地

?


1
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
packagecom.credream.ocr;
importjava.awt.Dimension;
importjava.awt.Rectangle;
importjava.awt.Robot;
importjava.awt.Toolkit;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjavax.imageio.ImageIO;
/*******************************************************************************
 * 該JavaBean可以直接在其他Java應用程序中調用,實現屏幕的"拍照" This JavaBean is
 
used to snapshot the
 * GUI in a Java application! You can embeded it in to your java application
 * source code, and us it to snapshot the right GUI of the application
 *
 * @see javax.ImageIO
 * @author liluqun ([email][email protected][/email])
 * @version 1.0
 *
 ******************************************************************************/
 
publicclass GuiCamera {
 
    privateString fileName; // 文件的前綴
 
    privateString defaultName = "GuiCamera";
 
    staticint serialNum = 0;
 
    privateString imageFormat; // 圖像文件的格式
 
    privateString defaultImageFormat = "jpg";
 
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
 
    
 
/***************************************************************************
     * 默認的文件前綴爲GuiCamera,文件格式爲PNG格式 The default construct
 
will use the default
     * Image file surname "GuiCamera", and default image format "png"
      
 
**************************************************************************/
    publicGuiCamera() {
        fileName = defaultName;
        imageFormat = defaultImageFormat;
 
    }
 
    
 
/***************************************************************************
     * @param s
     *            the surname of the snapshot file
     * @param format
     *            the format of the image file, it can be "jpg" or "png"
     *            本構造支持JPG和PNG文件的存儲
      
 
**************************************************************************/
    publicGuiCamera(String s, String format) {
 
        fileName = s;
        imageFormat = format;
    }
 
    
 
/***************************************************************************
     * 對屏幕進行拍照 snapShot the Gui once
      
 
**************************************************************************/
    publicvoid snapShot() {
 
        try{
            // 拷貝屏幕到一個BufferedImage對象screenshot
            BufferedImage screenshot = (newRobot())
                    .createScreenCapture(newRectangle(00,
                            (int) d.getWidth(), (int)
 
d.getHeight()));
            serialNum++;
            // 根據文件前綴變量和文件格式變量,自動生成文件名
            String name = fileName + String.valueOf(serialNum) + "."
                    + imageFormat;
            File f = newFile(name);
            System.out.print("Save File " + name);
            // 將screenshot對象寫入圖像文件
            ImageIO.write(screenshot, imageFormat, f);
            System.out.print("..Finished!\n");
        catch(Exception ex) {
            System.out.println(ex);
        }
    }
 
    publicstatic void main(String[] args) {
        GuiCamera cam = newGuiCamera("d:\\qq""bmp");//
        cam.snapShot();
    }
}

第二種方法:

原文地址:Java實現截圖並保存到本地

?
1
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
packagecom.credream.ocr;
 
importjava.awt.AWTException;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Graphics;
importjava.awt.GraphicsDevice;
importjava.awt.GraphicsEnvironment;
importjava.awt.Rectangle;
importjava.awt.Robot;
importjava.awt.Toolkit;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseMotionAdapter;
importjava.awt.image.BufferedImage;
importjava.awt.image.RescaleOp;
importjava.io.File;
importjava.io.IOException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjavax.imageio.ImageIO;
importjavax.swing.JFrame;
importjavax.swing.filechooser.FileSystemView;
 
/**
 * java截屏
 * 運行後將當前屏幕截取,並最大化顯示。
 * 拖拽鼠標,選擇自己需要的部分。
 * 按Esc鍵保存圖片到桌面,並退出程序。
 * 點擊右上角(沒有可見的按鈕),退出程序,不保存圖片。
 *
 * @author JinCeon
 */
publicclass SnapshotTest {
    publicstatic void main(String[] args) {
        // 全屏運行
        RectD rd = newRectD();
        GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment()
                .getDefaultScreenDevice();
        gd.setFullScreenWindow(rd);
    }
}
  
classRectD extendsJFrame {
    privatestatic final long serialVersionUID = 1L;
    intorgx, orgy, endx, endy;
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    BufferedImage image;
    BufferedImage tempImage;
    BufferedImage saveImage;
    Graphics g;
  
    @Override
    publicvoid paint(Graphics g) {
        RescaleOp ro = newRescaleOp(0.8f, 0null);
        tempImage = ro.filter(image, null);
        g.drawImage(tempImage, 00this);
    }
  
    publicRectD() {
        snapshot();
        setVisible(true);
        // setSize(d);//最大化窗口
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.addMouseListener(newMouseAdapter() {
            publicvoid mousePressed(MouseEvent e) {
                orgx = e.getX();
                orgy = e.getY();
            }
        });
        this.addMouseMotionListener(newMouseMotionAdapter() {
            publicvoid mouseDragged(MouseEvent e) {
                endx = e.getX();
                endy = e.getY();
                g = getGraphics();
                g.drawImage(tempImage, 00, RectD.this);
                intx = Math.min(orgx, endx);
                inty = Math.min(orgy, endy);
                intwidth = Math.abs(endx - orgx)+1;
                intheight = Math.abs(endy - orgy)+1;
                // 加上1,防止width或height爲0
                g.setColor(Color.BLUE);
                g.drawRect(x-1, y-1, width+1, height+1);
                //減1,加1都是爲了防止圖片將矩形框覆蓋掉
                saveImage = image.getSubimage(x, y, width, height);
                g.drawImage(saveImage, x, y, RectD.this);
            }
        });
        this.addKeyListener(newKeyAdapter() {
            @Override
            publicvoid keyReleased(KeyEvent e) {
                // 按Esc鍵退出
                if(e.getKeyCode() == 27) {
                    saveToFile();
                    System.exit(0);
                }
            }
        });
    }
  
    publicvoid saveToFile() {
        SimpleDateFormat sdf = newSimpleDateFormat("yyyymmddHHmmss");
        String name = sdf.format(newDate());
        File path = FileSystemView.getFileSystemView().getHomeDirectory();
        String format = "jpg";
        File f = newFile(path + File.separator + name + "."+ format);
        try{
            ImageIO.write(saveImage, format, f);
        catch(IOException e) {
            e.printStackTrace();
        }
    }
  
    publicvoid snapshot() {
        try{
            Robot robot = newRobot();
            Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
            image = robot.createScreenCapture(newRectangle(00, d.width,
                    d.height));
        catch(AWTException e) {
            e.printStackTrace();
        }
    }
}
第三種方法:
?
1
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
packagecom.credream.robotExp;
 
importjava.awt.AWTException;
importjava.awt.Rectangle;
importjava.awt.Robot;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.IOException;
importjavax.imageio.ImageIO;
publicclass RobotExp {
publicstatic void main(String[] args) {
try{
Robot robot = newRobot();
BufferedImage bi=robot.createScreenCapture(newRectangle(900,800)); // 根據指定的
 
區域(1300,800)抓取屏幕的指定區域
ImageIO.write(bi, "jpg"newFile("D:/imageTest.jpg")); //把抓取到的內容寫入到一
 
個jpg文件中
catch(AWTException e) {
e.printStackTrace();
catch(IOException e) {
e.printStackTrace();
}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章