Java实现截图的两种方式

第一种:截取全屏

public class GuiCamera {
private String fileName;//文件的前缀
private String defaultName = "GuiCamera";
static int serialNum = 0;
private String imageFormat;//图像文件的格式
private String defaultImageFormat = "png";
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
/**
* 默认的文件前缀为“GuiCamera”,文件的格式为png
* Dimension:Java的一个类,封装了一个构件的高度和宽度
*/

public GuiCamera() {
fileName = defaultName;
imageFormat = defaultImageFormat;
}

public GuiCamera(String s,String format) {
fileName = s;
imageFormat = format;
}

/**
* 对屏幕进行拍照

*/
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.println("Save File "+name);
//将screenshot对象写入图像文件
ImageIO.write(screenshot, imageFormat, f);
System.out.println("..Finished!\n");
} catch (Exception ex) {
// TODO Auto-generated catch block
System.out.println(ex);
}
}

public static void main(String[] args) {
GuiCamera cam= new GuiCamera("d:\\Hello", "png");
cam.snapShot();
}

}

第二种:根据鼠标移动确定截图的大小

public class ScreenShotTest {
public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
ScreenShotWindow ssw=new ScreenShotWindow();
ssw.setVisible(true);
} catch (AWTException e) {
e.printStackTrace();
}
}
});
}

}
/*
* 截图窗口
*/
class ScreenShotWindow extends JWindow
{
private int orgx, orgy, endx, endy;
private BufferedImage image=null;
private BufferedImage tempImage=null;
private BufferedImage saveImage=null;

private ToolsWindow tools=null;

public ScreenShotWindow() throws AWTException{
//获取屏幕尺寸
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds(0, 0, d.width, d.height);

//截取屏幕
Robot robot = new Robot();
image = robot.createScreenCapture(new Rectangle(0, 0, d.width,d.height));

this.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
//鼠标松开时记录结束点坐标,并隐藏操作窗口
orgx = e.getX();
orgy = e.getY();

if(tools!=null){
tools.setVisible(false);
}
}
@Override
public void mouseReleased(MouseEvent e) {
//鼠标松开时,显示操作窗口
if(tools==null){
tools=new ToolsWindow(ScreenShotWindow.this,e.getX(),e.getY());
}else{
tools.setLocation(e.getX(),e.getY());
}
tools.setVisible(true);
tools.toFront();
}
});

this.addMouseMotionListener(new MouseMotionAdapter() {

@Override
public void mouseDragged(MouseEvent e) {
//鼠标拖动时,记录坐标并重绘窗口
endx = e.getX();
endy = e.getY();

//临时图像,用于缓冲屏幕区域放置屏幕闪烁
Image tempImage2=createImage(ScreenShotWindow.this.getWidth(),ScreenShotWindow.this.getHeight());
Graphics g =tempImage2.getGraphics();
g.drawImage(tempImage, 0, 0, null);
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或height0
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, null);

ScreenShotWindow.this.getGraphics().drawImage(tempImage2,0,0,ScreenShotWindow.this);
}
});
}

@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 void saveImage() throws IOException {
JFileChooser jfc=new JFileChooser();
jfc.setDialogTitle("保存");

//文件过滤器,用户过滤可选择文件
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG", "jpg");
jfc.setFileFilter(filter);

//初始化一个默认文件(此文件会生成到桌面上)
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
String fileName = sdf.format(new Date());
File filePath = FileSystemView.getFileSystemView().getHomeDirectory();
File defaultFile = new File(filePath + File.separator + fileName + ".jpg");
jfc.setSelectedFile(defaultFile);

int flag = jfc.showSaveDialog(this);
if(flag==JFileChooser.APPROVE_OPTION){
File file=jfc.getSelectedFile();
String path=file.getPath();
//检查文件后缀,放置用户忘记输入后缀或者输入不正确的后缀
if(!(path.endsWith(".jpg")||path.endsWith(".JPG"))){
path+=".jpg";
}
//写入文件
ImageIO.write(saveImage,"jpg",new File(path));
System.exit(0);
}
}
}
/*
* 操作窗口
*/
class ToolsWindow extends JWindow
{
private ScreenShotWindow parent;

public ToolsWindow(ScreenShotWindow parent,int x,int y) {
this.parent=parent;
this.init();
this.setLocation(x, y);
this.pack();
this.setVisible(true);
}

private void init(){

this.setLayout(new BorderLayout());
JToolBar toolBar=new JToolBar("Java 截图");

//保存按钮
JButton saveButton=new JButton(new ImageIcon("images/save.gif"));
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
parent.saveImage();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
toolBar.add(saveButton);

//关闭按钮
JButton closeButton=new JButton(new ImageIcon("images/close.gif"));
closeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
toolBar.add(closeButton);

this.add(toolBar,BorderLayout.NORTH);
}

}

posted @ 2019-02-21 16:10  小王籽i  阅读(1671)  评论(0编辑  收藏  举报