本文实例总结了常见的java编程实现屏幕截图方法。分享给大家供大家参考,具体如下:
方法一:
import java.awt.Desktop; 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; public class CaptureScreen { public static void captureScreen(String fileName, String folder) throws Exception { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle screenRectangle = new Rectangle(screenSize); Robot robot = new Robot(); BufferedImage image = robot.createScreenCapture(screenRectangle); //保存路径 File screenFile = new File(fileName); if (!screenFile.exists()) { screenFile.mkdir(); } File f = new File(screenFile, folder); ImageIO.write(image, "png", f); //自动打开 if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) Desktop.getDesktop().open(f); } public static void main(String[] args) { try { captureScreen("e:\\你好","11.png"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
方法二:
package com.qiu.util; import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.imageio.*; /** * 一个简单的屏幕抓图 * **/ public class ScreenCapture { // test main public static void main(String[] args) throws Exception { String userdir = System.getProperty("user.dir"); File tempFile = new File("d:", "temp.png"); ScreenCapture capture = ScreenCapture.getInstance(); capture.captureImage(); JFrame frame = new JFrame(); JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); JLabel imagebox = new JLabel(); panel.add(BorderLayout.CENTER, imagebox); imagebox.setIcon(capture.getPickedIcon()); capture.saveToFile(tempFile); capture.captureImage(); imagebox.setIcon(capture.getPickedIcon()); frame.setContentPane(panel); frame.setSize(400, 300); frame.show(); System.out.println("Over"); } private ScreenCapture() { try { robot = new Robot(); } catch (AWTException e) { System.err.println("Internal Error: " + e); e.printStackTrace(); } JPanel cp = (JPanel) dialog.getContentPane(); cp.setLayout(new BorderLayout()); labFullScreenImage.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent evn) { isFirstPoint = true; pickedImage = fullScreenImage.getSubimage(recX, recY, recW, recH); dialog.setVisible(false); } }); labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent evn) { if (isFirstPoint) { x1 = evn.getX(); y1 = evn.getY(); isFirstPoint = false; } else { x2 = evn.getX(); y2 = evn.getY(); int maxX = Math.max(x1, x2); int maxY = Math.max(y1, y2); int minX = Math.min(x1, x2); int minY = Math.min(y1, y2); recX = minX; recY = minY; recW = maxX - minX; recH = maxY - minY; labFullScreenImage.drawRectangle(recX, recY, recW, recH); } } public void mouseMoved(MouseEvent e) { labFullScreenImage.drawCross(e.getX(), e.getY()); } }); cp.add(BorderLayout.CENTER, labFullScreenImage); dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); dialog.setAlwaysOnTop(true); dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize()); dialog.setUndecorated(true); dialog.setSize(dialog.getMaximumSize()); dialog.setModal(true); } // Singleton Pattern public static ScreenCapture getInstance() { return defaultCapturer; } /** 捕捉全屏慕 */ public Icon captureFullScreen() { fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit .getDefaultToolkit().getScreenSize())); ImageIcon icon = new ImageIcon(fullScreenImage); return icon; } /** 捕捉屏幕的一个矫形区域 */ public void captureImage() { fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit .getDefaultToolkit().getScreenSize())); ImageIcon icon = new ImageIcon(fullScreenImage); labFullScreenImage.setIcon(icon); dialog.setVisible(true); } /** 得到捕捉后的BufferedImage */ public BufferedImage getPickedImage() { return pickedImage; } /** 得到捕捉后的Icon */ public ImageIcon getPickedIcon() { return new ImageIcon(getPickedImage()); } /** * 储存为一个文件,为PNG格式 * * @deprecated replaced by saveAsPNG(File file) **/ @Deprecated public void saveToFile(File file) throws IOException { ImageIO.write(getPickedImage(), defaultImageFormater, file); } /** 储存为一个文件,为PNG格式 */ public void saveAsPNG(File file) throws IOException { ImageIO.write(getPickedImage(), "png", file); } /** 储存为一个JPEG格式图像文件 */ public void saveAsJPEG(File file) throws IOException { ImageIO.write(getPickedImage(), "JPEG", file); } /** 写入一个OutputStream */ public void write(OutputStream out) throws IOException { ImageIO.write(getPickedImage(), defaultImageFormater, out); } // singleton design pattern private static ScreenCapture defaultCapturer = new ScreenCapture(); private int x1, y1, x2, y2; private int recX, recY, recH, recW; // 截取的图像 private boolean isFirstPoint = true; private BackgroundImage labFullScreenImage = new BackgroundImage(); private Robot robot; private BufferedImage fullScreenImage; private BufferedImage pickedImage; private String defaultImageFormater = "png"; private JDialog dialog = new JDialog(); } /** 显示图片的Label */ class BackgroundImage extends JLabel { public void paintComponent(Graphics g) { super.paintComponent(g); g.drawRect(x, y, w, h); String area = Integer.toString(w) + " * " + Integer.toString(h); g.drawString(area, x + (int) w / 2 - 15, y + (int) h / 2); g.drawLine(lineX, 0, lineX, getHeight()); g.drawLine(0, lineY, getWidth(), lineY); } public void drawRectangle(int x, int y, int width, int height) { this.x = x; this.y = y; h = height; w = width; repaint(); } public void drawCross(int x, int y) { lineX = x; lineY = y; repaint(); } int lineX, lineY; int x, y, h, w; }
方法三:
因为有最小化到系统托盘,还是需要一张名为bg.gif作为托盘图标,图片应放在同级目录下,否则会空指针异常。
主要的截屏代码部分是:
Robot ro=new Robot(); Toolkit tk=Toolkit.getDefaultToolkit(); Dimension di=tk.getScreenSize(); Rectangle rec=new Rectangle(0,0,di.width,di.height); BufferedImage bi=ro.createScreenCapture(rec);
(源代码来源于CSDN)
import java.awt.*; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.event.*; import javax.swing.*; import java.io.*; import javax.imageio.*; import java.awt.image.*; public class CaptureScreen extends JFrame implements ActionListener{ private JButton start,cancel,saveAll; private JPanel c; private BufferedImage get; private JTabbedPane jtp;//一个放置很多份图片 private int index;//一个一直会递增的索引,用于标认图片 private JRadioButton java,system;//JAVA界面,系统界面 /** Creates a new instance of CaptureScreen */ public CaptureScreen() { super("屏幕截取软件(第三版)"); try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception exe){ exe.printStackTrace(); } initWindow(); initOther(); initTrayIcon(); } private void initOther(){ jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT); } private void initWindow(){ start=new JButton("开始截取"); saveAll=new JButton("保存所有"); cancel=new JButton("退出"); start.addActionListener(this); saveAll.addActionListener(this); cancel.addActionListener(this); JPanel buttonJP=new JPanel(); c=new JPanel(new BorderLayout()); c.setBackground(Color.BLACK); JLabel jl=new JLabel("屏幕截取",JLabel.CENTER); jl.setFont(new Font("黑体",Font.BOLD,40)); jl.setForeground(Color.RED); c.add(jl,BorderLayout.CENTER); buttonJP.add(start); buttonJP.add(saveAll); buttonJP.add(cancel); buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区")); JPanel jp=new JPanel();//放两个单选按钮的面板 jp.add(java=new JRadioButton("java界面")); jp.add(system=new JRadioButton("系统界面",true)); java.addActionListener(this); system.addActionListener(this); jp.setBorder(BorderFactory.createTitledBorder("界面风格")); ButtonGroup bg=new ButtonGroup(); bg.add(java); bg.add(system); JPanel all=new JPanel(); all.add(jp); all.add(buttonJP); this.getContentPane().add(c,BorderLayout.CENTER); this.getContentPane().add(all,BorderLayout.SOUTH); this.setSize(500,400); this.setLocationRelativeTo(null); this.setVisible(true); this.setAlwaysOnTop(true); this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent we){ CaptureScreen.this.setVisible(false); } }); } private void initTrayIcon(){ try{ SystemTray st=SystemTray.getSystemTray(); Image im=ImageIO.read(this.getClass().getResource("bg.gif")); PopupMenu pm=new PopupMenu("弹出菜单"); pm.add(new MenuItem("关于")).addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ JOptionPane.showMessageDialog(CaptureScreen.this,"" + "这是一款纯JAVA的屏幕截取程序 关于
在以前的基础上增加了一些常用的功能,
" + "比如,批量保存,多幅截取,复制到系统粘帖板...
" + "在使用过程中有任何问题,欢迎联系.
" + "作者:千里冰封
" + "QQ:24325142
"); } }); pm.addSeparator(); pm.add(new MenuItem("显示主窗口")).addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ CaptureScreen.this.setVisible(true); } }); pm.add(new MenuItem("开始截取")).addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ doStart(); } }); pm.add(new MenuItem("退出程序")).addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ System.exit(0); } }); TrayIcon ti=new TrayIcon(im,"JAVA屏幕截取",pm); st.add(ti); ti.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ CaptureScreen.this.setVisible(true); } }); }catch(Exception exe){ exe.printStackTrace(); } } private void updates(){ this.setVisible(true); if(get!=null){ //如果索引是0,则表示一张图片都没有被加入过, //则要清除当前的东西,重新把tabpane放进来 if(index==0){ c.removeAll(); c.add(jtp,BorderLayout.CENTER); }else{//否则的话,直接对tabpane添加面板就可以了 //就什么都不用做了 } PicPanel pic=new PicPanel(get); jtp.addTab("图片"+(++index),pic); jtp.setSelectedComponent(pic); SwingUtilities.updateComponentTreeUI(c); } } private void doStart(){ try{ this.setVisible(false); Thread.sleep(500);//睡500毫秒是为了让主窗完全不见 Robot ro=new Robot(); Toolkit tk=Toolkit.getDefaultToolkit(); Dimension di=tk.getScreenSize(); Rectangle rec=new Rectangle(0,0,di.width,di.height); BufferedImage bi=ro.createScreenCapture(rec); JFrame jf=new JFrame(); Temp temp=new Temp(jf,bi,di.width,di.height); jf.getContentPane().add(temp,BorderLayout.CENTER); jf.setUndecorated(true); jf.setSize(di); jf.setVisible(true); jf.setAlwaysOnTop(true); } catch(Exception exe){ exe.printStackTrace(); } } /** *公共方法,处理保存所有的图片 */ public void doSaveAll(){ if(jtp.getTabCount()==0){ JOptionPane.showMessageDialog(this,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE); return; } JFileChooser jfc=new JFileChooser("."); jfc.addChoosableFileFilter(new GIFfilter()); jfc.addChoosableFileFilter(new BMPfilter()); jfc.addChoosableFileFilter(new JPGfilter()); jfc.addChoosableFileFilter(new PNGfilter()); int i=jfc.showSaveDialog(this); if(i==JFileChooser.APPROVE_OPTION){ File file=jfc.getSelectedFile(); String about="PNG"; String ext=file.toString().toLowerCase(); javax.swing.filechooser.FileFilter ff=jfc.getFileFilter(); if(ff instanceof JPGfilter){ about="JPG"; } else if(ff instanceof PNGfilter){ about="PNG"; }else if(ff instanceof BMPfilter){ about="BMP"; }else if(ff instanceof GIFfilter){ about="GIF"; } if(ext.endsWith(about.toLowerCase())){ ext=ext.substring(0,ext.lastIndexOf(about.toLowerCase())); } //起一个线程去保存这些图片并显示出进度条 new SaveAllThread(ext,about).setVisible(true); } } //专门用来保存所有图片的线程类,它还要显示出保存的进度条 private class SaveAllThread extends JDialog implements Runnable{ private String name;//文件名头部份 private String ext;//文件格式 private JProgressBar jpb;//一个进度条 private JLabel info;// 一个信息显示条 private int allTask,doneTask;//所有任务,已完成任务 public SaveAllThread(String name,String ext){ super(CaptureScreen.this,"保存",true); this.name=name; this.ext=ext; initWindow(); } private void initWindow(){ jpb=new JProgressBar(); allTask=jtp.getTabCount(); jpb.setMaximum(allTask); jpb.setMinimum(0); jpb.setValue(0); jpb.setStringPainted(true); setProgressBarString(); info=new JLabel("正在保存到:"); this.getContentPane().setBackground(Color.CYAN); this.add(info,BorderLayout.NORTH); this.add(jpb,BorderLayout.SOUTH); this.setUndecorated(true); this.setSize(300,100); this.setLocationRelativeTo(CaptureScreen.this); new Thread(this).start(); } private void setProgressBarString(){ jpb.setString(""+doneTask+"/"+allTask); } public void run(){ try{ for(int i=0;i正在保存到:
"+f.toString()+"