随笔-46  评论-64  文章-2  trackbacks-0
今天稍微花了点时间实现了一个java的屏幕截图程序,功能简单,支持全屏截图和选择截图

用JSmooth做了个.exe程序,直接运行就可以了,

附:

程序下载 http://www.blogjava.net/Files/jht/MyScreenSnap.zip

JRE1.4版本的可执行程序 http://www.blogjava.net/Files/jht/MyScreenSnap_jre1.4.zip

关键的有几点
一、做一个透明效果的窗体
二、调用Robot类的捕获屏幕方法

代码比较粗糙,暂时就这样。

代码如下:
package cn.heapstack.MyScreenSnap;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.FlowLayout;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MenuFrame {
    
    
private JFrame frame;
    
private TranslucentFrame tframe;
    
private JPanel panel;
    
private JButton button1;
    
private JButton button2;
    
private JButton button3;
    
private FormListener formListener;
    
private Robot robot;
    
    
public static     GraphicsEnvironment graphenv = GraphicsEnvironment.getLocalGraphicsEnvironment ();
    
public static     GraphicsDevice [] screens = graphenv.getScreenDevices ();    
    
public static     DisplayMode mode = screens [0].getDisplayMode ();    
    
    
public MenuFrame()
    
{
        initComponents();
        
    }

    
    
public void initComponents()
    
{
        frame 
= new JFrame("MyScreenSnap Version:1.0 Author:jacky.jihao@gmail.com");
        
        tframe 
= new TranslucentFrame();
        panel 
= new JPanel();
        
        
try {
            
            robot 
= new Robot();
        }
 catch (AWTException e) {
            e.printStackTrace();
        }
 
        
        button1 
= new JButton("Capture Full Screen");
        button2 
= new JButton("Capture Selected Screen");
        button3 
= new JButton("Exit");
        formListener 
= new FormListener();
        button1.addActionListener(formListener);    
        button2.addActionListener(formListener);    
        button3.addActionListener(formListener);    
        
        
//fullScreenFrame.setVisible(false);
        tframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        tframe.setUndecorated(
true);
        tframe.setAlwaysOnTop(
true);
        tframe.setSize(
2000,2000);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.setLayout(
null);
        Dimension size 
= new Dimension(500,80);
        frame.setPreferredSize(size );
        frame.setSize(size);
        frame.setLocation(
300,300);
        frame.setBackground(Color.black);
        
        panel.setLocation(
00);
        panel.setSize(size);
        panel.setPreferredSize(size);
        panel.setLayout(
new FlowLayout());
        
        panel.setOpaque(
false);
        
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
        
        
        frame.add(panel);
        
        frame.pack();
        
        frame.show();
        
    }


    
class FormListener implements ActionListener
    
{
        
        
public void actionPerformed(ActionEvent e) {
            
if(e.getSource() == button1)
            
{
                System.out.println(
"Just capture the screen using a robot");
                frame.hide();
                Rectangle bounds 
= new Rectangle (00, mode.getWidth (), mode.getHeight ());    
                
                BufferedImage bimg 
= robot.createScreenCapture(bounds);
                                
                String fileName 
= String.valueOf(System.currentTimeMillis())+".png";
                File outputFile 
= new File(fileName);
                
try 
                
{
                    ImageIO.write(bimg, 
"png", outputFile);
                }
 
                
catch (IOException e1) 
                
{
                    e1.printStackTrace();
                }


                frame.show();
                System.out.println(
"File save as "+fileName);
                
            }

            
else if(e.getSource() == button2)
            
{
                System.out.println(
"Create a full screen frame");
                
if(!tframe.isShowing())
                
{
                    frame.hide();
                    tframe.updateBackground();
                    tframe.show();
                    frame.show();
                    frame.toBack();
                }

                
else
                    tframe.show();
                
            }

            
else if(e.getSource() == button3)
            
{
                System.exit(
0);
            }

            
        }

        
    }

    
    
public static void main(String[] args) {
        
new MenuFrame();
    }


}


package cn.heapstack.MyScreenSnap;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.image.BufferedImage;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class TranslucentFrame extends JFrame implements ComponentListener,
        WindowFocusListener, MouseListener, MouseMotionListener 
{

    
private boolean flag_prepare = true;

    
private BufferedImage background;

    
private Robot robot;

    
private Dimension size;

    
private Point startPoint;

    
private Point lastPoint;

    
private int width = 0;
    
private int w = 0;
    
private int h = 0;
    
private int height = 0;

    
public TranslucentFrame() {
        init();
    }


    
private void init() {
        
try {
            robot 
= new Robot();
            size 
= Toolkit.getDefaultToolkit().getScreenSize();
        }
 catch (AWTException e) {
            e.printStackTrace();
        }

        startPoint 
= new Point();
        lastPoint 
= new Point();
        
this.addWindowFocusListener(this);
        
this.addComponentListener(this);
        
this.addMouseListener(this);
        
this.addMouseMotionListener(this);

        
this.updateBackground();
    }


    
public void updateBackground() {
        background 
= robot.createScreenCapture(new Rectangle(00, (int) size
                .getWidth(), (
int) size.getHeight()));
    }


    
public void refresh() {

        
this.repaint();
    }


    
public void repaint() {
        Graphics g 
= this.getGraphics();

        g.setColor(Color.red);
        w 
= lastPoint.x - startPoint.x;
        h 
= lastPoint.y - startPoint.y;
        width 
= Math.abs(w);
        height 
= Math.abs(h);

        
// don't need to clear Rect now, just paint the background, it feels
        
// good
        
// g.clearRect(startPoint.x, startPoint.y, width, height);

        
this.paintComponents(g);

        
if (!this.flag_prepare) {

            
if (((w) < 0&& ((h) < 0)) {
                g.drawRect(lastPoint.x, lastPoint.y, width, height);

            }
 else if (((w) > 0&& ((h) < 0)) {
                g.drawRect(startPoint.x, lastPoint.y, width, height);

            }
 else if (((w) < 0&& ((h) > 0)) {
                g.drawRect(lastPoint.x, startPoint.y, width, height);

            }
 else if (((w) > 0&& ((h) > 0)) {
                g.drawRect(startPoint.x, startPoint.y, width, height);

            }

        }
 else {
            g.drawLine(
0, lastPoint.y, size.width, lastPoint.y);
            g.drawLine(lastPoint.x, 
0, lastPoint.x, size.height);
        }

    }


    
public void paintComponents(Graphics g) {
        Point pos 
= this.getLocationOnScreen();
        Point offset 
= new Point(-pos.x, -pos.y);
        g.drawImage(background, offset.x, offset.y, 
null);
    }


    
private static final long serialVersionUID = 3690836343560995785L;

    
public static void main(String[] args) {
        TranslucentFrame frame 
= new TranslucentFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setUndecorated(
true);
        frame.setAlwaysOnTop(
true);
        frame.setSize(
20002000);
        frame.show();

    }


    
public void componentHidden(ComponentEvent e) {
    }


    
public void componentMoved(ComponentEvent e) {
        
this.refresh();
    }


    
public void componentResized(ComponentEvent e) {
    }


    
public void componentShown(ComponentEvent e) {
        
this.refresh();
    }


    
public void windowGainedFocus(WindowEvent e) {
        
this.refresh();
    }


    
public void windowLostFocus(WindowEvent e) {
    }


    
public void mouseMoved(MouseEvent e) {
        
// System.out.println(e.getX() + ":" + e.getY());
        this.lastPoint.x = e.getX();
        
this.lastPoint.y = e.getY();
        repaint();
    }


    
public void mousePressed(MouseEvent e) {
        System.out.println(
"Mouse pressed , set the start point,x:" + e.getX()
                
+ " y:" + e.getY());
        
if (e.getButton() == MouseEvent.BUTTON3) {
            System.out.println(
"Get right mouse");
            
this.hide();
        }
 else {
            
this.flag_prepare = false;
            
this.startPoint.x = e.getX();
            
this.startPoint.y = e.getY();
        }

    }


    
public void mouseReleased(MouseEvent e) {
        System.out.println(
"Mouse released , set the last point,x:" + e.getX()
                
+ " y:" + e.getY());
        
this.flag_prepare = true;
        
// save the picture
        if (e.getButton() == MouseEvent.BUTTON1) {
            
            BufferedImage bimg 
= null;
            
if (((w) < 0&& ((h) < 0)) {
                
//g.drawRect(lastPoint.x, lastPoint.y, width, height);
                bimg = robot.createScreenCapture(new Rectangle(lastPoint.x+1, lastPoint.y+1, width-1, height-1));

            }
 else if (((w) > 0&& ((h) < 0)) {
                
//g.drawRect(startPoint.x, lastPoint.y, width, height);
                bimg = robot.createScreenCapture(new Rectangle(startPoint.x+1, lastPoint.y+1, width-1, height-1));

            }
 else if (((w) < 0&& ((h) > 0)) {
                
//g.drawRect(lastPoint.x, startPoint.y, width, height);
                bimg = robot.createScreenCapture(new Rectangle(lastPoint.x+1, startPoint.y+1, width-1, height-1));

            }
 else if (((w) > 0&& ((h) > 0)) {
                
//g.drawRect(startPoint.x, startPoint.y, width, height);
                bimg = robot.createScreenCapture(new Rectangle(startPoint.x+1, startPoint.y+1, width-1, height-1));

            }

            
            
            JFileChooser fcSave 
= new JFileChooser();
            fcSave.setCurrentDirectory(
new File(System.getProperty("user.dir")));
            fcSave.setSelectedFile(
null);
            
if (fcSave.showSaveDialog(this!= JFileChooser.APPROVE_OPTION)
                
return;

            File file 
= fcSave.getSelectedFile();
            String path 
= file.getAbsolutePath().toLowerCase();
            
if (!path.endsWith(".png"))
                file 
= new File(path += ".png");
            
            
            
try {
                ImageIO.write(bimg, 
"png", file);
            }
 catch (IOException e1) {
                e1.printStackTrace();
            }

        }


        
if (this.isShowing())
            repaint();
    }


    
public void mouseClicked(MouseEvent e) {

    }


    
public void mouseEntered(MouseEvent e) {

    }


    
public void mouseExited(MouseEvent e) {

    }


    
public void mouseDragged(MouseEvent e) {
        
this.lastPoint.x = e.getX();
        
this.lastPoint.y = e.getY();
        repaint();
    }


}


posted on 2007-03-29 19:19 jht 阅读(1666) 评论(5)  编辑  收藏 所属分类: J2SESwing Tips

评论:
# re: MyScreenSnap 一个简单的截图程序 2007-04-01 09:24 | zhenting
对jdk版本有没有什么要求?
我的是1.4  回复  更多评论
  
# re: MyScreenSnap 一个简单的截图程序 2007-09-13 15:09 | jht
稍微修改了一下,做了个支持jre1.4的  回复  更多评论
  
# re: MyScreenSnap 一个简单的截图程序 2007-09-13 15:37 | 千里冰封
呵呵,支持一下,不错:)  回复  更多评论
  
# re: MyScreenSnap 一个简单的截图程序 2009-11-30 09:58 | 消毒粉
能否给加点注释,看的好看点!  回复  更多评论
  
# re: MyScreenSnap 一个简单的截图程序 2011-09-09 08:14 | tb
有注释么   回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: