欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java实现截屏功能,java实现截屏,抓取思路是首先抓到屏幕的

来源: javaer 分享于  点击 33862 次 点评:129

java实现截屏功能,java实现截屏,抓取思路是首先抓到屏幕的


抓取思路是首先抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,Java也就可以获得鼠标的作用区域从而实现桌面中的小范围截屏。

Test.java

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionListener;/** * 用Java模拟出QQ桌面截图功能 * @author 五斗米 <如转载请保留作者和出处> * @blog http://blog.csdn.net/mq612 */public class Test extends JFrame { private static final long serialVersionUID = -267804510087895906L; private JButton button = null; private JLabel imgLabel = null; public Test() {  button = new JButton("模拟屏幕(点右键退出)");  button.addActionListener(new ActionListener() {   public void actionPerformed(ActionEvent e) {    try {     new ScreenWindow(imgLabel);    } catch (Exception e1) {     JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);    }   }  });  JPanel pane = new JPanel();  pane.setBackground(Color.WHITE);  imgLabel = new JLabel();  pane.add(imgLabel);  JScrollPane spane = new JScrollPane(pane);  this.getContentPane().add(button, BorderLayout.NORTH);  this.getContentPane().add(spane);  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  this.setSize(300, 200);  this.setLocationRelativeTo(null);  this.setVisible(true); } public static void main(String[] args) {  new Test(); }}class ScreenWindow extends JFrame { private static final long serialVersionUID = -3758062802950480258L; private boolean isDrag = false; private int x = 0; private int y = 0; private int xEnd = 0; private int yEnd = 0; public ScreenWindow(final JLabel imgLabel) throws AWTException, InterruptedException {  Dimension screenDims = Toolkit.getDefaultToolkit().getScreenSize();  JLabel label = new JLabel(new ImageIcon(ScreenImage.getScreenImage(0, 0, screenDims.width, screenDims.height)));  label.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));  label.addMouseListener(new MouseAdapter() {   public void mouseClicked(MouseEvent e) {    if (e.getButton() == MouseEvent.BUTTON3) {     dispose();    }   }   public void mousePressed(MouseEvent e) {    x = e.getX();    y = e.getY();   }   public void mouseReleased(MouseEvent e) {    if (isDrag) {     xEnd = e.getX();     yEnd = e.getY();     if(x > xEnd){      int temp = x;      x = xEnd;      xEnd = temp;     }     if(y > yEnd){      int temp = y;      y = yEnd;      yEnd = temp;     }     try {      imgLabel.setIcon(new ImageIcon(ScreenImage.getScreenImage(x, y, xEnd - x, yEnd - y)));     } catch (Exception ex) {      JOptionPane.showConfirmDialog(null, "出现意外错误!", "系统提示", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);     }     dispose();    }   }  });  label.addMouseMotionListener(new MouseMotionListener() {   public void mouseDragged(MouseEvent e) {    if(!isDrag)     isDrag = true;   }   public void mouseMoved(MouseEvent e) {    /** 拖动过程的虚线选取框需自己实现 */   }  });  this.setUndecorated(true);  this.getContentPane().add(label);  this.setSize(screenDims.width, screenDims.height);  this.setVisible(true);  this.setExtendedState(JFrame.MAXIMIZED_BOTH); }}class ScreenImage { public static Image getScreenImage(int x, int y, int w, int h) throws AWTException, InterruptedException {  Robot robot = new Robot();  Image screen = robot.createScreenCapture(new Rectangle(x, y, w, h)).getScaledInstance(w, h, Image.SCALE_SMOOTH);  MediaTracker tracker = new MediaTracker(new Label());  tracker.addImage(screen, 1);  tracker.waitForID(0);  return screen; }}
相关栏目:

用户点评