现在的位置: 首页 > 综合 > 正文

Java实例开发01-01 屏幕捕获工具

2013年05月21日 ⁄ 综合 ⁄ 共 5624字 ⁄ 字号 评论关闭

知识点:

1.Swing (使用eclipse插件Jigloo开发)

2.JPEG编码器

 

源码:

package chapter01.sample01;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

@SuppressWarnings("restriction")
public class CaptureScreen extends javax.swing.JFrame {
    private static final long serialVersionUID = -2726631763599696338L;
    private JMenuBar jMenuBar1;
    private JMenuItem jMenuItemClear;
    private JScrollPane jScrollPaneGloba;
    private JLabel jLabelShow;
    private JMenuItem jMenuItemExit;
    private JMenuItem jMenuItemSaveAs;
    private JMenuItem jMenuItemCapture;
    private JMenu jMenu1;

    private JFileChooser fileChooser = new JFileChooser();// 文件选择器
    private JPEGImageEncoder encoder = null;// JPEG编码器
    private Image tempImage = null;

    /**
     * Auto-generated main method to display this JFrame
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                CaptureScreen inst = new CaptureScreen();
                inst.setLocationRelativeTo(null);
                inst.setVisible(true);
            }
        });
    }

    public CaptureScreen() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            this.setTitle("CaptrueScreenTool");
            getContentPane().setLayout(null);
            {
                jScrollPaneGloba = new JScrollPane();
                getContentPane().add(jScrollPaneGloba);
                // jScrollPaneGloba.setBounds(0, 0, 384, 234);//不能这样子,否则还是窗体扩大了就会显示不全
                jScrollPaneGloba.setBounds(0, 0, Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
                {
                    jLabelShow = new JLabel();
                    jScrollPaneGloba.setViewportView(jLabelShow);// 面板的Viewport属性
                }
            }
            {
                jMenuBar1 = new JMenuBar();
                setJMenuBar(jMenuBar1);
                jMenuBar1.setSize(384, 30);
                jMenuBar1.setPreferredSize(new java.awt.Dimension(384, 30));
                {
                    jMenu1 = new JMenu();
                    jMenuBar1.add(jMenu1);
                    jMenu1.setText("\u64cd\u4f5c");
                    {
                        jMenuItemCapture = new JMenuItem();
                        jMenu1.add(jMenuItemCapture);
                        jMenuItemCapture.setText("\u622a\u5c4f");
                        jMenuItemCapture.setAccelerator(KeyStroke.getKeyStroke("shift ctrl pressed P"));
                        jMenuItemCapture.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                jMenuItemCaptureActionPerformed(evt);
                            }
                        });
                    }
                    {
                        jMenuItemSaveAs = new JMenuItem();
                        jMenu1.add(jMenuItemSaveAs);
                        jMenuItemSaveAs.setText("\u4fdd\u5b58");
                        jMenuItemSaveAs.setAccelerator(KeyStroke.getKeyStroke("shift pressed S"));
                        jMenuItemSaveAs.setEnabled(false);
                        jMenuItemSaveAs.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                saveImage();
                            }
                        });
                    }
                    {
                        jMenuItemClear = new JMenuItem();
                        jMenu1.add(jMenuItemClear);
                        jMenuItemClear.setText("\u6e05\u7a7a");
                        jMenuItemClear.setAccelerator(KeyStroke.getKeyStroke("shift ctrl pressed C"));
                        jMenuItemClear.setEnabled(false);
                        jMenuItemClear.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                jMenuItemClearActionPerformed(evt);
                            }
                        });
                    }
                    {
                        jMenuItemExit = new JMenuItem();
                        jMenu1.add(jMenuItemExit);
                        jMenuItemExit.setText("\u9000\u51fa");
                        jMenuItemExit.setAccelerator(KeyStroke.getKeyStroke("shift ctrl pressed X"));
                        jMenuItemExit.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent evt) {
                                jMenuItemExitActionPerformed(evt);
                            }
                        });
                    }
                }
            }
            pack();
            setSize(400, 300);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void jMenuItemCaptureActionPerformed(ActionEvent evt) {
        tempImage = this.createImage();
        jLabelShow.setIcon(new ImageIcon(tempImage));
        jMenuItemCapture.setEnabled(false);
        jMenuItemSaveAs.setEnabled(true);
        jMenuItemClear.setEnabled(true);
    }

    // 截屏 :这里是重点,保存图片
    private Image createImage() {
        try {
            Image tempLocalImage = null;
            Robot robot = new Robot();
            Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
            Rectangle scrRectangle = new Rectangle(0, 0, dimension.width, dimension.height);
            tempLocalImage = robot.createScreenCapture(scrRectangle);
            return tempLocalImage;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 保存 :这里是保存图片的代码
    private void saveImage() {
        try {
            int save = fileChooser.showSaveDialog(this);// Pops up a "Save File" file chooser dialog.
            if (save == JFileChooser.APPROVE_OPTION) {// 点击了OK(或者Yes)
                // 获取要设置的文件名(包括路径)
                File saveFileName = fileChooser.getSelectedFile();
                // 获取要保存文件的名字
                String fileName = new String(saveFileName.getPath() + ".jpg");// abstract pathname
                // 1.首先创建一个输出流
                FileOutputStream fileOutputStream = new FileOutputStream(fileName);
                // 2.然后把输出流用JPEG编码器进行包裹,其实就是把输出流连接到编码器
                encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);
                // 把BufferedImage对象进行编码
                encoder.encode((BufferedImage) tempImage);
                fileOutputStream.flush();// 清空缓存
                fileOutputStream.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // 清空
    private void jMenuItemClearActionPerformed(ActionEvent evt) {
        jLabelShow.setIcon(null);
        jMenuItemCapture.setEnabled(true);
        jMenuItemClear.setEnabled(false);
        jMenuItemSaveAs.setEnabled(false);
    }

    // 退出
    private void jMenuItemExitActionPerformed(ActionEvent evt) {
        System.exit(0);
    }

}

显示效果:

6

 

截出来的图片:当时的整个屏幕的图片

test

抱歉!评论已关闭.