java实现截屏功能的代码详解编程语言

抓取思路是首先抓到屏幕的整个图象,将图象显示在一个JFrame中,再将JFrame全屏显示,这样就模拟出了一个桌面,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; 
 } 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10952.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论