Java實現截圖并保存到本地
1.java實現截圖并保存到本地
提供給大家三個方法,也是整理的,都不是很難,大家需要的看看哈
2.原理都相似
------------------------------------------------------------------
package com.credream.ocr; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; import javax.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]liluqun@263.net[/email])
- @version 1.0 * **/
public class GuiCamera {
private String fileName; // 文件的前綴
private String defaultName = "GuiCamera";
static int serialNum = 0;
private String imageFormat; // 圖像文件的格式
private String 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"
**/ public GuiCamera() { 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文件的存儲
**/ public GuiCamera(String s, String format) {
fileName = s;
imageFormat = format;
}
/***
* 對屏幕進行拍照 snapShot the Gui once
**/ public void snapShot() {
try {
// 拷貝屏幕到一個BufferedImage對象screenshot
BufferedImage screenshot = (new Robot())
.createScreenCapture(new Rectangle(0, 0,
(int) d.getWidth(), (int)
d.getHeight())); serialNum++; // 根據文件前綴變量和文件格式變量,自動生成文件名 String name = fileName + String.valueOf(serialNum) + "."
+ imageFormat;
File f = new File(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);
}
}
public static void main(String[] args) {
GuiCamera cam = new GuiCamera("d:\\qq", "bmp");//
cam.snapShot();
}
}</pre>
-----------------------------------------------------------------------------
第二種方法:
package com.credream.ocr;import java.awt.AWTException; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.image.BufferedImage; import java.awt.image.RescaleOp; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.filechooser.FileSystemView;
/**
- java截屏
- 運行后將當前屏幕截取,并最大化顯示。
- 拖拽鼠標,選擇自己需要的部分。
- 按Esc鍵保存圖片到桌面,并退出程序。
- 點擊右上角(沒有可見的按鈕),退出程序,不保存圖片。 *
- @author JinCeon
*/
public class SnapshotTest {
public static void main(String[] args) {
} }// 全屏運行 RectD rd = new RectD(); GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice(); gd.setFullScreenWindow(rd);
class RectD extends JFrame { private static final long serialVersionUID = 1L; int orgx, orgy, endx, endy; Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); BufferedImage image; BufferedImage tempImage; BufferedImage saveImage; Graphics g;
@Override
public void paint(Graphics g) {
RescaleOp ro = new RescaleOp(0.8f, 0, null);
tempImage = ro.filter(image, null);
g.drawImage(tempImage, 0, 0, this);
}
public RectD() {
snapshot();
setVisible(true);
// setSize(d);//最大化窗口
setDefaultCloseOperation(EXIT_ON_CLOSE);
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
orgx = e.getX();
orgy = e.getY();
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endx = e.getX();
endy = e.getY();
g = getGraphics();
g.drawImage(tempImage, 0, 0, RectD.this);
int x = Math.min(orgx, endx);
int y = Math.min(orgy, endy);
int width = Math.abs(endx - orgx)+1;
int height = 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(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
// 按Esc鍵退出
if (e.getKeyCode() == 27) {
saveToFile();
System.exit(0);
}
}
});
}
public void saveToFile() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
String name = sdf.format(new Date());
File path = FileSystemView.getFileSystemView().getHomeDirectory();
String format = "jpg";
File f = new File(path + File.separator + name + "." + format);
try {
ImageIO.write(saveImage, format, f);
} catch (IOException e) {
e.printStackTrace();
}
}
public void snapshot() {
try {
Robot robot = new Robot();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
image = robot.createScreenCapture(new Rectangle(0, 0, d.width,
d.height));
} catch (AWTException e) {
e.printStackTrace();
}
}
}</pre>
-------------------------------------------------------------
第三種方法:
package com.credream.robotExp;import java.awt.AWTException; import java.awt.Rectangle; import java.awt.Robot; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class RobotExp { public static void main(String[] args) { try { Robot robot = new Robot(); BufferedImage bi=robot.createScreenCapture(new Rectangle(900,800)); // 根據指定的
區域(1300,800)抓取屏幕的指定區域 ImageIO.write(bi, "jpg", new File("D:/imageTest.jpg")); //把抓取到的內容寫入到一
個jpg文件中 } catch (AWTException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }</pre>
----------------------------------------------------------------------
三種方法,大致相同,只不過加了些額外的方法,功能而已;都挺簡單就不多說了...