• java 截屏 类似于 QQ截屏


    package com.sun.test;

    import java.awt.AWTException;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    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.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionAdapter;
    import java.awt.image.BufferedImage;
    import java.awt.image.RescaleOp;
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;

    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JToolBar;
    import javax.swing.JWindow;
    import javax.swing.filechooser.FileNameExtensionFilter;
    import javax.swing.filechooser.FileSystemView;


    public class ScreenShotTest {
    public static void main(String[] args) {

    EventQueue.invokeLater(new Runnable() {
    @Override
    public void run() {
    try {
    ScreenShotWindow ssw=new ScreenShotWindow();
    ssw.setVisible(true);
    } catch (AWTException e) {
    e.printStackTrace();
    }
    }
    });
    }

    }
    /*
    * 截图窗口
    */
    class ScreenShotWindow extends JWindow
    {
    private int orgx, orgy, endx, endy;
    private BufferedImage image=null;
    private BufferedImage tempImage=null;
    private BufferedImage saveImage=null;

    private ToolsWindow tools=null;

    public ScreenShotWindow() throws AWTException{
    //获取屏幕尺寸
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    this.setBounds(0, 0, d.width, d.height);

    //截取屏幕
    Robot robot = new Robot();
    image = robot.createScreenCapture(new Rectangle(0, 0, d.width,d.height));

    this.addMouseListener(new MouseAdapter() {
    @Override
    public void mousePressed(MouseEvent e) {
    //鼠标松开时记录结束点坐标,并隐藏操作窗口
    orgx = e.getX();
    orgy = e.getY();

    if(tools!=null){
    tools.setVisible(false);
    }
    }
    @Override
    public void mouseReleased(MouseEvent e) {
    //鼠标松开时,显示操作窗口
    if(tools==null){
    tools=new ToolsWindow(ScreenShotWindow.this,e.getX(),e.getY());
    }else{
    tools.setLocation(e.getX(),e.getY());
    }
    tools.setVisible(true);
    tools.toFront();
    }
    });

    this.addMouseMotionListener(new MouseMotionAdapter() {

    @Override
    public void mouseDragged(MouseEvent e) {
    //鼠标拖动时,记录坐标并重绘窗口
    endx = e.getX();
    endy = e.getY();

    //临时图像,用于缓冲屏幕区域放置屏幕闪烁
    Image tempImage2=createImage(ScreenShotWindow.this.getWidth(),ScreenShotWindow.this.getHeight());
    Graphics g =tempImage2.getGraphics();
    g.drawImage(tempImage, 0, 0, null);
    int x = Math.min(orgx, endx);
    int y = Math.min(orgy, endy);
    int width = Math.abs(endx - orgx)+1;
    int height = Math.abs(endy - orgy)+1;
    // 加上1防止width或height0
    g.setColor(Color.BLUE);
    g.drawRect(x-1, y-1, width+1, height+1);
    //减1加1都了防止图片矩形框覆盖掉
    saveImage = image.getSubimage(x, y, width, height);
    g.drawImage(saveImage, x, y, null);

    ScreenShotWindow.this.getGraphics().drawImage(tempImage2,0,0,ScreenShotWindow.this);
    }
    });
    }

    @Override
    public void paint(Graphics g) {
    RescaleOp ro = new RescaleOp(0.8f, 0, null);
    tempImage = ro.filter(image, null);
    g.drawImage(tempImage, 0, 0, this);
    }
    //保存图像到文件
    public void saveImage() throws IOException {
    JFileChooser jfc=new JFileChooser();
    jfc.setDialogTitle("保存");

    //文件过滤器,用户过滤可选择文件
    FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG", "jpg");
    jfc.setFileFilter(filter);

    //初始化一个默认文件(此文件会生成到桌面上)
    SimpleDateFormat sdf = new SimpleDateFormat("yyyymmddHHmmss");
    String fileName = sdf.format(new Date());
    File filePath = FileSystemView.getFileSystemView().getHomeDirectory();
    File defaultFile = new File(filePath + File.separator + fileName + ".jpg");
    jfc.setSelectedFile(defaultFile);

    int flag = jfc.showSaveDialog(this);
    if(flag==JFileChooser.APPROVE_OPTION){
    File file=jfc.getSelectedFile();
    String path=file.getPath();
    //检查文件后缀,放置用户忘记输入后缀或者输入不正确的后缀
    if(!(path.endsWith(".jpg")||path.endsWith(".JPG"))){
    path+=".jpg";
    }
    //写入文件
    ImageIO.write(saveImage,"jpg",new File(path));
    System.exit(0);
    }
    }
    }
    /*
    * 操作窗口
    */
    class ToolsWindow extends JWindow
    {
    private ScreenShotWindow parent;

    public ToolsWindow(ScreenShotWindow parent,int x,int y) {
    this.parent=parent;
    this.init();
    this.setLocation(x, y);
    this.pack();
    this.setVisible(true);
    }

    private void init(){

    this.setLayout(new BorderLayout());
    JToolBar toolBar=new JToolBar("Java 截图");

    //保存按钮
    JButton saveButton=new JButton(new ImageIcon("images/save.gif"));
    saveButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    try {
    parent.saveImage();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    });
    toolBar.add(saveButton);

    //关闭按钮
    JButton closeButton=new JButton(new ImageIcon("images/close.gif"));
    closeButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.exit(0);
    }
    });
    toolBar.add(closeButton);

    this.add(toolBar,BorderLayout.NORTH);
    }

    }

  • 相关阅读:
    hdu 1272 小希的迷宫
    hdu 1318 Palindromes
    ANR traces中内存占用情况解读
    请教会linux shell脚本的=~是什么意思?
    kernel struct definition location
    SecureCRT sysrq键设置
    sysrq
    Linux中断管理 (1)Linux中断管理机制【转】
    Linux suspend 流程介绍(2)之 freeze task
    Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/6109214.html
Copyright © 2020-2023  润新知