Java 实现截图功能——网摘

之前实现了Java截屏,现在我进一步的完善,实现了Java截图,提到截图,大家一定会想到QQ中同时按住Ctrl+Alt+A开启截图功能吧,不知道的现在应该也知道了吧,那么就立即登录QQ,同时按住Ctrl+Alt+A体验一下截图功能。哈哈,闲话少说,现在我就为大家介绍一下Java中是如何实现屏幕截图的吧,具体的我就不语言描述了,还是上代码吧,代码注释很详细,一切答案尽在代码中!
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.MouseListener;
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 花新昌
*/
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;//鼠标按下和释放时x、y轴坐标
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);//构造一个具有所希望的缩放因子和偏移量的新 RescaleOp
tempImage = ro.filter(image, null);//对源 BufferedImage对象image进行重缩放
g.drawImage(tempImage, 0, 0, this);
}
public RectD() {
snapshot();
setVisible(true);//设置窗口可见
setSize(d);//最大化窗口
setDefaultCloseOperation(JFrame.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() {
public void keyReleased(KeyEvent e) {
//按Esc键
if(e.getKeyCode() == 27) {
if(saveImage!=null){
saveToFile();//保存图片
}
System.exit(0);//退出
}
}
});
this.addMouseListener(new MouseListener(){
@Override
public void mouseClicked(MouseEvent e) {//单击(双击)组件时调用
// TODO Auto-generated method stub
//双击鼠标左键
if(e.getClickCount()==2){
if(saveImage!=null){//如果截图了则保存图片到桌面
saveToFile();
}
System.exit(0);//退出
}
}
@Override
public void mouseEntered(MouseEvent e) {//进入组件时调用
// TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {//离开组件时调用
// TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent e) {//在组件上按下鼠标按键时调用
// TODO Auto-generated method stub
//点击鼠标右键则退出程序
if(e.getModifiers()==MouseEvent.BUTTON3_MASK){
System.exit(0);
}
}
@Override
public void mouseReleased(MouseEvent e) {//在组件上释放鼠标按钮时调用
// TODO Auto-generated method stub

}
});
}
//保存图片到桌面,图片名称格式为yyyymmddHHmmss.jpg
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();//在基本屏幕坐标系中构造一个 Robot对象
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
image = robot.createScreenCapture(new Rectangle(0, 0, d.width,d.height));//获得整个屏幕
} catch (AWTException e) {
e.printStackTrace();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值