文档章节

简单的截图软件

miring
 miring
发布于 2017/04/21 13:01
字数 747
阅读 15
收藏 0

在使用计算机时,有时会需要持久保存屏幕上显示的内容,此时可以使用截图软件将指定的区域制作成图片保存。比较好用的截图软件有Snagit、红蜻蜓等。本实例将使用Java的Robot类编写一个功能非常简单的截图软件。实例运行效果如图 输入图片说明 Robot类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot的主要目的是便于Java平台实现自动测试。使用该类生成输入事件与将事件发送到AWT事件队列或AWT控件的区别在于,事件是在平台的本机输入队列中生成的。例如,Robot.mouseMove将实际移动鼠标光标,而不是只生成鼠标移动事件。注意,某些平台需要特定权限或扩展来访问低级输入控件。如果当前平台配置不允许使用输入控件,那么试图构造Robot对象时将抛出AWTException。为了截图需要使用createScreenCapture()方法,该方法的声明如下:

public BufferedImage createScreenCapture(Rectangle screenRect)

参数说明 screenRect:将在屏幕坐标中捕获的Rect。 (1)编写类ScreenCapture,该类继承了JFrame。在框架中包含了一个标签用来显示截图效果,一个“开始截图”按钮用来实现截图并在标签中显示。 (2)编写方法do_button_actionPerformed(),用来监听单击“开始截图”按钮事件。在该方法中,完成截图并在标签上显示截图的效果。代码如下:

package com.mingrisoft.robot;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
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.awt.image.ImageProducer;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.UIManager;
import javax.swing.border.EtchedBorder;

public class ScreenCapture extends JFrame {
    
    /**
     * 
     */
    private static final long serialVersionUID = -5093584478732778943L;
    private JPanel contentPane;
    private JLabel imageLabel;
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ScreenCapture frame = new ScreenCapture();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the frame.
     */
    public ScreenCapture() {
        setTitle("\u622A\u56FE\u8F6F\u4EF6");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        
        JPanel buttonPanel = new JPanel();
        contentPane.add(buttonPanel, BorderLayout.SOUTH);
        
        JButton button = new JButton("\u5F00\u59CB\u622A\u56FE");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                do_button_actionPerformed(e);
            }
        });
        button.setFont(new Font("微软雅黑", Font.PLAIN, 18));
        buttonPanel.add(button);
        
        JPanel imagePanel = new JPanel();
        contentPane.add(imagePanel, BorderLayout.CENTER);
        imagePanel.setLayout(new BorderLayout(0, 0));
        
        imageLabel = new JLabel("");
        imageLabel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
        imageLabel.setHorizontalAlignment(SwingConstants.CENTER);
        imagePanel.add(imageLabel);
    }
    
    protected void do_button_actionPerformed(ActionEvent e) {
        try {
            Robot robot = new Robot();// 创建Robot对象
            Toolkit toolkit = Toolkit.getDefaultToolkit();// 获得Toolkit对象
            Rectangle area = new Rectangle(toolkit.getScreenSize());// 设置截取区域为全屏
            // 将BufferedImage转换成Image
            BufferedImage bufferedImage = robot.createScreenCapture(area);
            ImageProducer producer = bufferedImage.getSource();
            Image image = toolkit.createImage(producer);
            imageLabel.setIcon(new ImageIcon(image));// 显示图片
        } catch (AWTException e1) {
            e1.printStackTrace();
        }
    }
    
}

心法领悟:截图程序的增强。 读者可以在本程序的基础上,增加让用户输入要截图的范围。还可以增加图片的保存功能,即使用输出流将图片写入到本地文件。

© 著作权归作者所有

miring
粉丝 0
博文 23
码字总数 14869
作品 0
长春
程序员
私信 提问
FireFox抓屏插件--FireShot

Fireshot来源于截图软件Screenshot Studio的 开发商,是一个Firefox扩展或者说是Firefox版的Screenshot Studio(一款很强大的且与众不同的截图软件),用于创建网页截图。重要的是,Firesho...

匿名
2008/09/19
8.5K
0
关于Linux下的抓图软件和使用方法介绍

Linux越来越受到人们的关注,使用的人也越来越多。Linux用户可以通过网络交流使用经验、介绍好的软件。在交流中,人们经常互相在网上贴张屏幕截图,使得相互之间的交流变得更加直接、容易。这...

范堡
2009/05/08
1K
0
新版 Android 2.3.3 开放截图功能

Google在Android的最新版本 2.3.3中开放了截图功能,以后第三方软件将可不需求Root权限下通过 SurfaceFlinger API截取到屏幕图片。目前国内市面上能实现这类功能的仅有豌豆夹和魔乐两家软件。...

红薯
2011/03/02
2.5K
0
几款效率神器助你走上人生巅峰之园友推荐

一、背景   在上篇文章中,我给大家推荐了我工作和生活中最常用的效率软件,引起了猿友的热烈反响,那么这篇文章,我们就来扒一扒猿友留言推荐的效率软件,望诸君笑纳~ 二、猿友推荐软件清...

hafiz.zhang
2017/10/27
0
0
GNOME 3.10 正式发布

Matthias Clasen 通过邮件列表 宣布 GNOME 3.10 正式版发布了,之前我们发布了一些值得关注的特性,看起来大部分的这些特性都在正式版中实现了。 在我看来,最显著的外观变化应该就是对 Wayl...

oschina
2013/09/26
4.4K
27

没有更多内容

加载失败,请刷新页面

加载更多

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的...

Java领航员
52分钟前
3
0
动态规划-硬币问题分析

什么是动态规划 上次对动态规划已经有了个大概的分析。引用维基百科的话就是: dynamic programming is a method for solving a complex problem by breaking it down into a collection of...

AI考拉
今天
2
0
谈谈lucene的DocValues特性之SortedSetDocValuesField

SortedSetDocValuesField与SortedDocValuesField类似但它是一键多值的(注意:lucene的数据模型是支持一键多值的即key-values模型),lucene在实现时会判断是一键一值还是多值,如果单值就调...

FAT_mt
今天
1
0
生产者消费者模式

//尚学堂视频里,不是完整的 public class Movie { /** * 共同的资源 */ private String pic; //flay为true生产,false消费 private boolean flag=true; public synchronized void play(Str......

南桥北木
今天
1
0
使用阿里云镜像安装kubernetes

参考阿里云镜像 https://opsx.alibaba.com/mirror?lang=zh-CN 系统: CentOS / RHEL / Fedora cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https......

北漂的我
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部