基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于java+BS的QQ屏幕截图工具设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

文章目录:

  • 基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)
    • 1、项目简介
    • 2、资源详情
    • 3、关键词:
    • 4、毕设简介:
    • 5、源码下载:

1、项目简介

  1. 本软件采用Java语言进行模拟qq截图功能,获取屏幕方式灵活,可以获取指定的屏幕,并且可以对获取到的截图进行存储,编辑(添加文字)等操作,对这些操作设置了自定义热键。该软件主要有捕获光标功能,可以指定截取屏幕的区域。

  2. 软件具有捕捉光标,可以随着鼠标的移动获取屏幕区域,为之后的存储和编辑提供前置条件。图片可以自命名,获取到的截图可以依据当前系统时间进行命名,也可以通过模板(文件名)进行命名,拥有自命名功能。获取到的截图可以在窗口中央位置进行预览,并且可以指定存储区域将截图用bmp,jpeg,png(静态), gif(动态)其中的某一种图像格式将其存储,拥有预览和存储功能。可以直接将获取到的截图复制到剪切板中,之后可以从剪切板中粘贴到word等文档中。多层菜单栏,可以获取一到多个截图,并以多个界面显示出来,拥有层叠功能。可以通过编辑为截图添加文字,为截图添加一些描述信息之后仍可以将截图存储,用户有编辑功能。

  3. 基于java的QQ截屏工具的设计和实现能够实现对屏幕的随机截取,复制,保存以及添加文字等操作,便于用户对数据的处理。
    该软件的功能:
    (1)随机获取屏幕指定区域;
    (2)编辑(添加文字)截图;
    (3)存储截


2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:20271个字
包含内容:整套源码+完整毕业论文+答辩PPT+任务书+辅导视频+运行截图


3、关键词:

截图;存储;编辑;java;


4、毕设简介:

提示:以下为毕业设计的简略介绍,项目源码及完整毕业论文下载地址见文末。

1. 绪论
截图,就是绝对的记录计算机某一的区域画面,以图片的方式进行存储,供人们使用,按照个人的需要选择其中的某个片段将其保存下来,并且截取到的屏幕与你眼睛所看到的内容一模一样,根据需求可以保存下来自己使用,或者发送给其他人一同使用该截图。
省略

1.1课题背景
截图工具能够截图,存储,拷贝,可以帮我们改善生活,提高工作效率,我们生活中的一些问题可以通过它来解决。常用的截图方法有:各种浏览器自带的截图,某些聊天工具自带的截图,FastStone Capture8.2等专用截图工具截图,计算机操作系统自身附带的截图小软件截图,但这些方法都有一些这样或那样的局限性,这样,这款精致高效的、即学即用的Java截图软件就能够满足这方面客户需求。
省略

1.2课题研究内容
以简单易操作为出发点,设计出这款单机版的截图工具,获取屏幕灵活,可以随机获取屏幕任意区域并且可以对获取到的截图进行存储,编辑(添加文字)等操作,对这些操作设置了自定义热键。该软件主要有捕获光标功能,可以指定截取屏幕的区域。

图片可以自命名,获取到的截图可以依据当前系统时间进行命名,也可以通过模板(文件名)进行命名,拥有自命名功能。

获取到的截图可以在窗口中央位置进行预览,并且可以指定存储位置将截图用bmp,jpeg,png等(静态), gif(动态)其中的某一种图像格式将其存储,拥有预览和存储功能。

多层菜单栏,可以获取一到多个截图,并以多个界面显示出来,拥有层叠功能。

可以通过编辑为截图添加文字,为截图添加一些描述信息之后仍可以将截图存储,用户有编辑功能。

2.可行性分析及开发环境的选择
2.1可行性分析
省略

2.1.1技术可行性
Browser(浏览器)/Server(服务器)结构,简称B/S结构,Java语言以及网络技术是截图工具的主要技术,这些技术都是目前常用的技术,很容易找到相应的工具。因此,对于此系统,技术上没有麻烦的问题,并且维护和操作也较为方便。

2.1.2经济可行性
截图工具对硬件方面没有硬性要求,且这个项目是我们自行开发,成本几乎可以不计,后期维护也不需要大量的费用。

2.1.3法律可行性
eclipse的是一个开源的,免费的软件,代码同样是开放的,并且此设计并不用来营利,是自己设计开发的,所以不会引发责任以及侵权问题,满足法律可行性。

2.1.4可行性结论
由上述可得,不管在上述哪方面都为可行的,要求也不是很高,因此,此系统是满足开发的可行性的。

2.2运行环境的选择
此设计对环境没有硬性要求,对计算机也没有过高的要求,个人、学校、企业均可以使用。在Windows系统或者Linux系统下均可使用(但注意版本问题),操作,维护以及用户使用均很方便。

由于系统本身规模并不大,不需要多台计算机,只需一台即可,使用过程中不收取任何费用,成本不高,用户使用只需登录即可。

2.3开发工具的选择
本项目的开发过程中语言选择java语言,软件选择eclipse,通过这两项来设计此项目。其中,eclipse这款软件的设计环境是开源的、免费的,这个环境在进行java开发时能够拓宽范围的。对于它自己来说,一个宽泛的大体架构以及某些特定的服务组成了eclipse,各种各样的插件以及大量的组件相互结合,统一起来就组成了eclipse的设计环境。当然这有必要提一提:eclipse它自己自带了一个比较规范的可以当作准则的collection,可以将所有插件以及组件储存起来,最为典型的就是java development kit。

省略

2.4 B/S结构
Browser/Server,当然为了方便,简化其名称为B/S,是网络潮流的带领下演化出来的比较时尚的,较为受欢迎的web架构。用户终端离不开的,广受大众欢迎的是能够连接Internet的浏览器。用户终端被集中在一起进行管理,所有重要的需求实现必须放在服务器端,使系统以及各种软件设计、运行和使用简单方便,清晰明了。客户机上只要安装一个浏览器,如错误!超链接引用无效。或错误!超链接引用无效。,将oracle,mysql数据库安装到服务器端。各种浏览器与数据库之间的交互数据是通过网络服务进行的。

省略

3.系统需求分析
省略

一般来说,系统的设计与实现必须满足以下几个基本需求:(1)效果需要;(2)性能供应(3)能够上市与有保障(4)解决异常(5)协接的处理(6)限制(7)反方向的处理(8)日后有几率产生的需要。

需求分析步骤: ⑴首先调查组织机构情况⑵然后调查各部门的业务活动情况⑶协助用户明确对新系统的各种要求⑷确定新系统的边界⑸分析系统功能⑹分析系统数据⑺编写分析报告。

3.1业务需求
能够实现对屏幕的随机截取,复制,保存以及添加文字等操作,便于用户对数据的处理。

3.2用户需求
用户给设计者提出的软件上的需求,是对产品的的要求。

3.3性能需求
指定的界面效果为系统效果,界面清晰,通俗易懂,操作简洁,用户使用时得心应手。

4.系统设计
系统设计,现如今软件设计必不可少的physical design。依据用户在需求分析时提出的系统功能需求进行设计,最终确定系统的逻辑要求、性能模型,在满足用户需求,依据用户所使用的的系统环境,拿出一个方案使得此项目能够在电脑的web环境上运行,通过系统的设计建立软件项目的物理模块。

省略

4.1系统的设计目标
自制Java截图工具将原来纯手动输入取代了,能够将所需要的信息以截图的形式保存下来,是操作更速度更方便。

该软件的功能:
随机获取屏幕指定区域;
编辑(添加文字)截图;
存储截图;

4.2系统功能整体设计
开发的总体设计:
截图:根据提示,随机获取指定屏幕区域
编辑:在图片上添加文字
存储:指定存储目录将截图进行存储
流程图请看下图:

图4-2 程序流程图

5.系统设计实现
5.1系统主界面实现
系统主界面有公共操作区、操作栏、界面布局三部分。

操作栏部分代码以及注解:
JPanel all=new JPanel();
all.add(jp);
all.add(buttonJP);
通过getContentPane()方法得到窗体最下面那个面板然后往面板上添加控件c然后放到窗体的正中央位置;在窗体南方的位置上添加一个控件。
设置控件的尺寸宽500高400
设置窗口相对于指定组件的位置。 如果组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央。
设置组件的可见性,如果为true则组件可见
设置将该窗体永远在最前端显示
用户单击窗口的关闭按钮时程序执行的操作界面布局注解:JPanel jp=new JPanel();jp.add(system=new JRadioButton("系统界面",true));system.addActionListener(this);jp.setBorder(BorderFactory.createTitledBorder("界面风格"));
创建面板jp,
给jp设置一个标题,标题名称为界面风格,
将面板jp设置为系统界面
给其添加到动作监听器
页面效果代码及注解:
public void actionPerformed(ActionEvent ae){这里写一个动作开始执行的方法,参数是一个动作事件,先声明一个新的变量来获取这个事件源,然后在通过if语句判断动作类型:start执行的是开始截屏动作;cancel执行的是退出操作。else if(source==cancel){System.exit(0);}
如果事件源的值为system,则显示本软件的系统外观,这里需要捕获一下异常。}}

系统的外观如下图所示:

图5-1 系统外观图

5.2系统截图实现
设置起点终点横纵坐标,注解请看下面:

这里实现的是获取截取屏幕范围起点、终点的横纵坐标,然后将这个范围的边框设置为红色,画出对应截取屏幕的范围。

对于纵坐标y,通过三目运算符判断,如果startY小于endY,那么y的值为startY,否则为endY。

选择区域的变量设置为select,创建一个新的矩形框对象,他的宽是起点的横坐标减去终点的横坐标的绝对值;他的高是起点的纵坐标减去终点的纵坐标的绝对值。

设置八点的位置,注解请看下面:
设置八个点的位置,先创建一个坐标对象,设置他的起始点和终点,起点就是x,y两个参数减去5个像素点,终点的位置在(10,10)
第二个点同上边的第一个点。

然后是第三个点的位置,判断起点的横坐标是否大于终点的横坐标,如果结果为true,则起始点横坐标为startX,否则为EndX;终点的坐标依然是(10,10)
依次往后的点都如同第三个点;

运行这个软件的效果:
通过if语句来判断代码是否开始执行,在这里调用前边写的方法,设置截图区域待确认状态下是青色,fillrect该函数用指定的画刷填充矩形,然后在设置截图边框颜色为红色,设置drawRect,将需要截图的矩形框坐标参数传入其中,设置他的颜色为黑色,然后设置drawString方法,在截图的时候输出一些提示用户的信息。

开始截图选择指定区域的4个顶点以及每条边的中点,展示图请看下图:

图5-2 八点及边线展示图

定义鼠标移动的处理方法,目的是初始化即将勾取的屏幕区域区域代码:

创建带参数的私有的无返回值的方法doMouseMoved,进行鼠标移动勾选电脑屏幕的指定区域,在该方法中,如果所选的内容包括了me参数所获得的点的坐标,那么就将创建一个新的对象Cursor,并将该对象的值设定为MOVE_COURSOR,并将current的属性值移动;

如果不包括me,那么就将Status的值存入到一个数组中,进行循环,通过for循环,循环条件是声明一个局部的整型变量将i小于他的长度,i需要在一次执行结束进行自加一,再在循环里进行判断,如果它与me获得的值相同,那么将数组对应值传入到current在将此值设置到cursor里,在判断语句里写上return,若果满足则结束方法。循环结束后再将设置cursor,并将current的值设置为默认的。

将鼠标来回移动一次来获取此时此刻鼠标所处的位置.注解如下:

//通过八个方向(上北下南左西右东)决定x坐标与y坐标,并将它们进行刷新值
创建带参数的无返回值类型的initSelect方法,参数为state,

即:private void initSelect(States state){
使用判断语句switch/case的判断方式进行多次判断,如果state状态为默认状态,那么将x坐标设置为0,y坐标设置为0,用break进行结束case;
switch(state){
case DEFAULT:
currentX=0;
currentY=0;
break;

同理:对于不同的state将X,Y坐标进行设置;

若果state状态设置为东(EAST),那么将x坐标设置为三目运算并进行判断,如果x结束时的坐标大于x开始的坐标,就输出结束时的x坐标,反之就输出x开始时的坐标,y坐标设置为0,用break结束case;

即:currentX=(endX>startX?END_X:START_X); currentY=0; break;
若果state状态设置为西(WEST),那么将x坐标设置为三目运算并进行判断,

如果x结束时的坐标大于x开始的坐标,就输出开始时的x坐标,反之就输出x结束时的坐标,y坐标设置为0,用break结束case;

若果state状态设置为北(NORTH),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出开始时的y坐标,反之就输出y结束时的坐标,x坐标设置为0,用break结束case;

若果state状态设置为南(SOUTH),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出结束时的y坐标,反之就输出y开始时的坐标,x坐标设置为0,用break结束case;

若果state状态设置为东北(NORTH_EAST),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出结束时的y坐标,反之就输出y开始时的坐标,x坐标设置为三目运算并进行判断,如果x结束时的坐大于x开始的坐标,就输出开始时的y坐标,反之输出结束时的y坐标,用break结束case;

若果state状态设置为西北(NORTH_WEST),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出开始时的y坐标,反之就输出y结束时的坐标,x坐标设置为三目运算并进行判断,如果x结束时的坐大于x开始的坐标,就输出开始时的x坐标,反之输出结束时的x坐标,用break结束case;

若果state状态设置为东南(SOUTH_EAST),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出结束时的y坐标,反之就输出y开始时的坐标,x坐标设置为三目运算并进行判断,如果x结束时的坐大于x开始的坐标,就输出结束时的x坐标,反之输出开始时的x坐标,用break结束case;

若果state状态设置为西南(SOUTH_WEST),那么将y坐标设置为三目运算并进行判断,如果y结束时的坐标小于y开始的坐标,就输出结束时的y坐标,反之就输出y开始时的坐标,x坐标设置为三目运算并进行判断,如果x结束时的坐大于x开始的坐标,就输出开始时的x坐标,反之输出结束时的x坐标,用break结束case;当不属于以上情况时,将x的坐标设置为0,y坐标设置为0。
}

在窗口显示所截图片注解:

创建一个类Temp并且继承面板类最后实现鼠标监听接口:
private class Temp extends JPanel implements MouseListener,MouseMotionListener

在该类中声明几个对象,即:
私有的缓冲图片类型bi,即:private BufferedImage bi;
私有的整型宽度以及长度,即: private int width,height;
私有的整型x的起始坐标,y的起始坐标,x的结束坐标,y的结束坐标, 以及临时的x坐标,y坐标,即:private int startX,startY,endX,endY,tempX,tempY;
私有的面板jf,即:private JFrame jf;
私有的矩形select并初始化为0,即:private Rectangle select=new Rectangle(0,0,0,0);
私有的cursor类型的cs,即:
private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);
私有的状态current并设置为默认值,即:private States current=States.DEFAULT;
私有的矩形数组,即: private Rectangle[] rec;
公有的的静态常量x的开始坐标,即:public static final int START_X=1;
公有的的静态常量x的结束坐标,即:public static final int START_Y=2;
公有的的静态常量y的开始坐标,即:public static final int END_X=3;
公有的的静态常量y的结束坐标,即:public static final int END_Y=4;
private Point p=new Point();
private boolean showTip=true;
创建公有的有参的Temp构造函数(参数为面板jf,缓冲图片bi,以及图片的长度,图片的宽度),即:public Temp(JFrame jf,BufferedImage bi,int width,int height){
函数体将jf赋值给Temp的jf,
bi赋值给Temp的bi,
宽度赋值给Temp的宽度,
高度赋值给Temp的高度,
在将鼠标监听器加到Temp上,
调用方法initRecs();}
创建私有的无参无返回值类型的方法initRecs,方法体里创建新的矩形对象,for循环生成矩形的八点坐标;即:private void initRecs()
创建公有的带参数的无返回值类型的方法paintComponent,方法体里进行划线,指定画线的起始以及终点坐标,即:public void paintComponent(Graphics g)
并将线设置成红色,
划线x的起始坐标,y的起始坐标,x的终止坐标,y的起始坐标,
画第二条线x的起始坐标,y的结束坐标,x的终止坐标,y的终止坐标,
画第三条线x的起始坐标,y的起始坐标,x的起始坐标,y的终止坐标,
画第四条线x的结束坐标,y的起始坐标,x的终止坐标,y的终止坐标,
并将x坐标重新进行赋值,若x的起始坐标小于x的终止坐标,x值为x的起始坐标,反之为x的结束坐标,
并将y坐标重新进行赋值,若y的起始坐标小于y的终止坐标,y值为y的起始坐标,反之为y的结束坐标,
将新的矩形对象设置为(x,y,起始与终止的x坐标差的绝对值,起始与终止的y坐标差的绝对值),
设置x1的值为起始与终止坐标和的一半,设置y1的值为起始与终止坐标和的一半,将其设置为 (x1-2,startY-2,5,5);g.fillRect(x1-2,endY-2,5,5);g.fillRect(startX-2,y1-2,5,5);g.fillRect(endX-2,y1-2,5,5);g.fillRect(startX-2,startY-2,5,5);g.fillRect(startX-2,endY-2,5,5);g.fillRect(endX-2,startY-2,5,5);g.fillRect(endX-2,endY-2,5,5);
并且以矩形框设置第一个点的像素点 (x-5,y-5,10,10);
以矩形框设置第二个点的像素点 (x1-5,y-5,10,10);
以矩形框设置第三个点的像素点((startX>endX?startX:endX)-5,y-5,10,10);
以矩形框设置第四个点的像素点((startX>endX?startX:endX)-5,y1-5,10,10);
以矩形框设置第五个点的像素点((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10);
以矩形框设置第六个点的像素点(x1-5,(startY>endY?startY:endY)-5,10,10);
以矩形框设置第七个点的像素点(x-5,(startY>endY?startY:endY)-5,10,10);
以矩形框设置第八个点的像素点(x-5,y1-5,10,10);并将颜色设置为青色,再次将其设置为(p.x,p.y,170,20);设置颜色为红色,画框(p.x,p.y,170,20);设置颜色为黑色,在(p.x,p.y+15)写下内容“请按住鼠标左键不放选择截图区”。
如果成功截图,则进入截图展示页面,在多层菜单栏显示出第几张图片,图片正下方有四个选项:”复制到剪切板”,”存储”,”关闭”,”编辑”,展示效果请看下图:

图5-2 成功截图展示图
操作栏四个按钮的设置,注解请看下面:

声明一个私有的返回值为空的方法initPanel(),方法里声明四个按钮:“保存”、“复制到剪切板”、“关闭”、“编辑”。
将他们分别赋值给四个变量使用:save、copy、close、update。然后分别将他们的菜单选项热键设置为:s、c、x、u
声明一个新的Jpanel类型的变量buttonPanel,将上边四个按钮添进去,然后分别给四个变量添加四个动作监听器。
声明一个返回值为空的带动作事件参数的方法,是个动作监听的方法。
在创建一个新的Object类型的变量source用于接收事件源。
再通过if语句比对,来判断系统改做出设么样的动作:
save调用对应的存储模块;
copy调用对应的拷贝模块;
close则调用关闭模块。

5.3截图的编辑实现
将要在截图上添加文字时,点击编辑,弹出编辑窗口,先将截图保存,之后选择截图进行添加文字,选择相关属性后点击添加。

主界面设置代码及注解:

定义了一个私有的获取截图方法,并且声明一个截图对象,然后把他放到保存之后进行编辑(如:添加文字)panel.setBorder(new TitledBorder(border, "设置",Font.LAYOUT_LEFT_TO_RIGHT,Font.LAYOUT_LEFT_TO_RIGHT, font));
里面运用一个布局管理器,部件如果想加入其中需要借助GridBagConstraints,利用组件的横纵坐标,并设置了组件所占行列数,也就是截图的宽度,还有截图的高度,当组件在其格内而不能撑满其格时,通过fill的值来设定填充方式,gbc.insets = new Insets(5, 10, 5, 10);gbc.fill = GridBagConstraints.BOTH;gbc.gridwidth = 1;JLabel label;label = new JLabel("选择字体:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER; fontCB = new JComboBox(Common.getAvailableFontFamilyNames());panel.add(fontCB, gbc);gbc.weightx = 1.0;gbc.gridwidth = 1;label = new JLabel("字体大小:", JLabel.RIGHT);panel.add(label, gbc);fontsizeTF = new JTextField("15");panel.add(fontsizeTF, gbc);label = new JLabel("水印位置:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER;towardCB = new JComboBox(toward);panel.add(towardCB, gbc);gbc.gridwidth = 1;label = new JLabel("字体样式:", JLabel.RIGHT);panel.add(label, gbc);fontstyleCB = new JComboBox(fontstyle);panel.add(fontstyleCB, gbc);label = new JLabel("水印颜色:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER;fontcolorCB = new JComboBox(fontcolor);panel.add(fontcolorCB, gbc);gbc.weightx = 1.0;gbc.gridwidth = 1;label = new JLabel("透明度:", JLabel.RIGHT);panel.add(label, gbc);利用滑块,用户可以用来对截图进行大小滚动查看,如果再深加设置,还可以通过拖拽来调节一些信息,比如音量,背光亮度等,可以在代码中生成对应的输出口。}});panel.add(alphaSlider, gbc);label = new JLabel("缩放大小:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER;scaleCB = new JComboBox(scales);panel.add(scaleCB, gbc);gbc.gridwidth = 1;label = new JLabel("水印内容:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER;markTF = new JTextField("From CSDN Cannel_2020's blog");panel.add(markTF, gbc);gbc.gridwidth = 1;label = new JLabel("执行进度:", JLabel.RIGHT);panel.add(label, gbc);gbc.gridwidth = GridBagConstraints.REMAINDER;progressBar = new JProgressBar(0, 1);  progressBar.setStringPainted(true);  panel.add(progressBar, gbc);Common.setComponentsFont(panel, font);return panel;}
部分按钮设置相关代码:protected enum ButtonStyle{selectImage("选择图片"),selectSavepath("选择存放路径"),preview("预览效果"),batching("批量添加"),moreSetting("更多设置"),drirect("添加文字");private String name;ButtonStyle(String name){this.name = name;}public String getButtonName(){return name;}}

界面以及按钮的展示图如下:

图5-3 添加文字界面

实现添加文字的方法:

public static BufferedImage watermark(String filepath, Font font, Color color,int toward, String mark, float alpha,float scale) {return watermark(new File(filepath), font, color, toward, mark, alpha, scale);}private static Image getFileImage(File file){Image image = null;if(Common.getFileExtension(file.getName()).equals("bmp")){FileInputStream in = null;try {in = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}image = BMPLoader.read(in);}else{try {image = ImageIO.read(file);} catch (IOException e) {e.printStackTrace();}}return image;}private static BufferedImage getMyBufferedImage(File file, float scale){Image image = getFileImage(file);      BufferedImage buffImg = null;try {buffImg = javax.imageio.ImageIO.read(file);} catch (IOException e) {e.printStackTrace();}获取到了截图的宽度和高度,并把它放到了符合的类型中。排除非空情况。buffImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2D g2d = buffImg.createGraphics();g2d.setColor(Color.white);g2d.fillRect(0, 0, width, height);g2d.drawImage(image, 0, 0, width, height, null);if(scale != 1.0f){BufferedImage filteredBufImage =new BufferedImage((int) (width*scale), (int) (height*scale),BufferedImage.TYPE_INT_RGB);AffineTransform transform = new AffineTransform();transform.setToScale(scale, scale); AffineTransformOp imageOp = new AffineTransformOp(transform, null);imageOp.filter(buffImg, filteredBufImage);buffImg = filteredBufImage;}return buffImg;}private static Point getStringWidthAndHeight(String str, Graphics2D g2d){FontMetrics fontMetrics = g2d.getFontMetrics();int stringWidth = fontMetrics.stringWidth(str);int stringAscent = fontMetrics.getAscent();return new Point(stringWidth, stringAscent);}private static void printWatemark(float alpha, String mark, Graphics2D g2d, int x, int y){g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));g2d.drawString(mark, x, y);}private static Point calculate(Point p, int toward, double imgWidth, double imgHeight){int x = 0, y = 0;if(toward == UP_LEFT_TO_DOWN_RIGHT){double hypotenuse = Math.sqrt(Math.pow(imgWidth, 2)+ Math.pow(imgHeight, 2));double tempX = (p.x/2) * imgWidth/hypotenuse;double tempY = (p.x/2) * imgHeight/hypotenuse;x = (int) (imgWidth/2 - tempX);y = (int) (imgHeight/2 - tempY);}else if(toward == UP_RIGHT_TO_DOWN_LEFT){double hypotenuse = Math.sqrt(Math.pow(imgWidth, 2)+ Math.pow(imgHeight, 2));double tempX = (p.x/2) * imgWidth/hypotenuse;double tempY = (p.x/2) * imgHeight/hypotenuse;x = (int) (imgWidth/2 - tempX);y = (int) (imgHeight/2 + tempY);}else if(toward == DOWN_RIGHT){x = (int)imgWidth - p.x;y = (int)imgHeight - p.y;}else if(toward == DOWN_LEFT){x = 5;y = (int)imgHeight - p.y;}else if(toward == UP_RIGHT){x = (int)imgWidth - p.x - 3;y = p.y;}else if(toward == UP_LEFT){x = 5;y = p.y;}else if(toward == MIDDLE){x = (int)imgWidth/2-p.x/2;y = (int)imgHeight/2;}return new Point(x, y);}public static BufferedImage watermark(File file, Font font,Color color, int toward, String mark, float alpha, float scale){BufferedImage buffImg = getMyBufferedImage(file, scale);Graphics2D g2d = buffImg.createGraphics();g2d.setRenderingHints(getMyRenderingHints());g2d.setFont(font);g2d.setColor(color);double imgWidth = buffImg.getWidth();double imgHeight = buffImg .getHeight();Point p = getStringWidthAndHeight(mark, g2d);Point p1 = calculate(p, toward, imgWidth, imgHeight);if(toward == UP_LEFT_TO_DOWN_RIGHT){g2d.rotate(Math.atan(imgHeight/imgWidth), p1.x, p1.y); }else if(toward == UP_RIGHT_TO_DOWN_LEFT){g2d.rotate(-Math.atan(imgHeight/imgWidth), p1.x, p1.y);}printWatemark(alpha, mark, g2d, p1.x, p1.y);g2d.dispose();return buffImg;}生成添加文字之后的图片代码:private void generate(BufferedImage buffImg, String savePath) {int temp = savePath.lastIndexOf(".") + 1;try {ImageIO.write(buffImg,savePath.substring(temp), newFile(savePath));} catch (IOException e1) {e1.printStackTrace();}}
预览截图的相关代码及注解:private static final long serialVersionUID = 1L;public PreviewImage(final BufferedImage buffImg) {int imgHeight = buffImg.getHeight();int imgWidth = buffImg.getWidth();JPanel imgPanel = new JPanel() {private static final long serialVersionUID = 6246862165441423926L;super.paintComponent(Graphics g)通过调用父类的绘制事件,并重写父类的绘制函数,调用了父类的相应方法,并且父类的方法中还有可能包含一些默认操作,因为有些操作是必须的,绘制的时候并且,进行了非空判断,对于绘制的要求if (buffImg != null) {g2d.drawImage(buffImg, 0, 0, this);}}};setSize(imgWidth, imgHeight);Common.setCentered(this) setUndecorated(true);addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {dispose();}}});DragPicListener listener = new DragPicListener(this);addMouseListener(listener);addMouseMotionListener(listener);add(imgPanel);setVisible(true);}

预览效果展示图:

图5-3-2预览添加文字

5.4截图的存储实现
获取截取完成后,单击按钮:”复制到剪切板”,可以看到提示框,内容写的是”已成功复制到剪切板”,单击鼠标左键确认,即成功的将截图复制到剪切板中.

请看下述代码及注解:

定义此信息框对于用户操作的一个判断这个方法的参数,在对于复制截图到剪切板中的时候,如果图片为空的话,就提示用户为空,否则就成功复制到剪切板。并添加了捕获异常的控件,如果出现错误,就提示用户说 复制到系统粘贴板出错,控件消失。} // java.awt.datatransfer(接口)Transferable trans = new Transferable(){ // 内部类public DataFlavor[] getTransferDataFlavors() {return new DataFlavor[] { DataFlavor.imageFlavor };}public boolean isDataFlavorSupported(DataFlavor flavor) {return DataFlavor.imageFlavor.equals(flavor);}public Object getTransferData(DataFlavor flavor)throws UnsupportedFlavorException, IOException {if(isDataFlavorSupported(flavor))return image;throw new UnsupportedFlavorException(flavor);}};Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);JOptionPane.showMessageDialog(this,"已复制到系统粘帖板!!");}catch(Exception exe){exe.printStackTrace();JOptionPane.showMessageDialog(this,"复制到系统粘帖板出错!!","错误",JOptionPane.ERROR_MESSAGE);}
}
Transferable是一个用于不同存储介质间数据传输的接口,必须通过此接口才能实现两个存储介质间的数据传输,此接口还封装了数据传输过程的具体方式。主要的方法有:(1)Object getTransferData(DataFlavor flavor) 返回一个Transferable数据传输对象,参数则用来指定数据传输过程中的数据传输格式;(2)DataFlavor[] getTransferDataFlavors() 用来返回一个DataFlavor数组;(3)Boolean isDataFlavorSupported(DataFlavor flavor) 判断当前用来传输数据的Transferable对象的数据传输格式是否符合DataFlavor对象中的几种格式(stringFlavor,imageFlavor,plainTextFlavor)
Transferable对象是用来传输数据的,DataFlavor则封装于该对象中用来指定该对象传输数据时的数据的格式

展示图请看下图:

图5-4-1 将截图保存到剪切板
新建一个word文档测试文件是否复制到剪切板中去,展示图请看下面:

图5-4-1 新建的文档

图5-4-2 文档里的内容

结果显示成功的复制到剪切板中,此模块成功的实现了功能。

获取图片后,单击按钮“存储”,进行保存截图,这时将会让你选择截图的存储位置,还要选择截图所需要保存的格式,如静态的(bmp,jpeg,png),动态的(gif)等格式。

请看下述注解:
定义了一个保存方法,并在方法中进行异常的捕获,开头的时候进行了保存图片的获得判断,如果它没有读到图片信息的话,就提示用户图片不能为空,否则就跳出这个方法,然后引入了保存不同类型,不同格式的图片,并一一进行了引入,传人了this这个状态信息,,并设置了格式过滤器,如果是静态的图片就选择相对应的保存格式,这些格式的判断方法在代码中已经一一进行了判断,保存格式有jpeg,png,bmp,如果是动态的图片,就需要就需要保存为gif的格式,并且如果再运行过程中,如果抓到异常,要在控制台打印错误信息!!

其中需要设置格式过滤器,选择所需要的格式:
这是向用户可选择的文件过滤器列表添加一个过滤器,如果应该保存该文件就返回true,否则返回false,用户点击保存按钮的时候,由继承了这个过滤器类上门的UI调用此方法,但要确保指定的文件是可见的,不是隐藏的,并要通知对此事件感兴趣的所有侦听器,最后返回一个bmp对象,给用户一个反馈.
这是通过继承filechooser类来让用户最终确定保存的格式,给用户提供了一种简单的机制,并返回用户保存路径,通过用户选择的保存格式,通过它相对应的过滤器,如保存GIG格式的过滤器privateclassGIFfilter并且写了一个暂时类,来显示当前的屏幕图像,TEMP,引证了过滤器的判断,最终实现jpeg,bmp,png,和动态图片gif,的保存。
展示图请看下面:

图5-4-3 截图保存过程图
点击保存后,进入到目录下进行查看,查看是否保存成功。

图5-4-3 查看已保存的截图
经查看已经成功存储

6.系统测试
系统测试,即整合起来众多的元素展开测试,测试他们集合在一起能否正常运行,这些内容包括各种方面种种信息比如,系统软件和应用软件、电脑硬件、外接鼠标键盘等硬件、Internet等方面结合起来,进行系统测试,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案。

6.1截图软件系统测试
进行系统测试,测试此项目的软件运行是否达到目标需求,分别进行截图保存的测试,复制的测试,编辑(添加文字)的测试。

6.1.1保存选项测试
成功获取图片之后,图片不失效提示“成功存储”,反之,提示“未能成功存储”,若未写图片名进行存储那么不能存储。

图6-1-1-1 截图保存

图6-1-1-2 成功保存
经运行测试,证明保存截图功能没有问题,已经成功实现。

6.1.2复制到剪切板选项测试
成功获取图片之后,图片不失效提示“成功存储”,反之,提示“未能成功存入到剪切板”。

图6-1-2-1 复制到剪切板

图6-1-2-2 复制到剪切板成功
经过运行测试,证明复制到剪切板功能没有问题,已经成功实现。

6.1.3编辑选项测试
在图片上添加文字,成功显示文字则编辑成功,反之,失败。

图6-1-3-1 添加文字

图6-1-3-2 添加文字成功
经过运行测试,证明添加文字功能没有问题,已经成功实现。

6.2测试评价
结果证明需求的功能已经被实现,满足了用户截图,存储,编辑功能,不足之处是功能仍然有些欠缺,系统外观的美化需要进一步去调整,期望以后加以调整完善。测试未能发现严重缺陷和漏洞。

结论
经过自己的不懈努力,加上老师和朋友的帮助,终于完成了这个小型的Java截图工具。
省略

参考文献
[1] 程新党;程强;黄河涛.基于Windows图形驱动的屏幕截图技术. 南阳师范学院计算机系;南阳师范学院计算机系 河南南阳473061;河南南阳473061
[2] 魏威.利用C#和GDI+制作屏幕截图小软件.图形图像处理(2013年23期)
[3] 张之.QQ屏幕截图的秘密.CFan加油站 (2007年10期).
[4] 吴颂涛;张瑶.电视直播截屏系统及方法. 电视中心 (2014年12期)
[5] 王志军.善用PowerPoint的截图工具. 办公与应用 (2013年12期).
[6] 何昭友;.WINCE下屏幕截图与为徒转换.瓦斯灾害监控与应急技术国家重点实验室;中国煤炭科工集团重庆研究院;.
[7] 庞赫;基于Windows图形驱动的屏幕截图技术.石家庄市外国语学校: 新技术(2015年06期)
[8] Bonnie Imler,Michelle Eichelberger. Using screen capture to study user research behavior. 1Penn State Altoona, Altoona, Pennsylvania, USA; Genesee Community College, Batavia, New York, USA. Library Hi Tech, 2011, Vol.29 (3)
[9] Pekka Makkonen,Kerstin Siakas,Shakespeare Vaidya. Teaching knowledge management by combining wikis and screen capture videos. 1Department of Information Systems, University of Jyväskylä, Jyväskylä, Finland; Department of Informatics, Technological Educational Institution of Thessaloniki, Thessaloniki, Greece; United Nations Development Program, Ottawa, Canada. Campus-Wide Information Systems, 2011, Vol.28 (5)
[10] Susan Goodwin. Using screen capture software for web site usability and redesign buy-in. 1Texas A&M University Libraries, Sterling C. Evans Library, Instructional Services Department, College Station, Texas, USA. Library Hi Tech, 2005, Vol.23 (4)


5、源码下载:

本项目源码及论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号 毕业设计全套资源(点击下载)
本项目源码 基于java+BS的QQ屏幕截图工具设计与实现(源码+文档)_JAVA_BS_QQ屏幕截图工具.zip

【java毕业设计】基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)——屏幕截图工具相关推荐

  1. java毕业设计——基于JSP+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统

    基于JSP+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的学生信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  2. java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统

    基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+mysql的BBS论坛系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  3. java毕业设计——基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码)——旅游管理系统

    基于JSP+access的旅游管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+access的旅游管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  4. java毕业设计——基于JSP+sqlserver的网上购物系统设计与实现(毕业论文+程序源码)——网上购物系统

    基于JSP+sqlserver的网上购物系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的网上购物系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  5. java毕业设计——基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码)——房产中介系统

    基于JSP+sqlserver的房产中介系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+sqlserver的房产中介系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  6. java毕业设计——基于JSP+mysql的图书馆借阅系统设计与实现(毕业论文+程序源码)——图书馆借阅系统

    基于JSP+mysql的图书馆借阅系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于JSP+mysql的图书馆借阅系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  7. asp毕业设计——基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码)——新闻发布系统

    基于asp+access的新闻发布系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的新闻发布系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  8. asp毕业设计——基于asp+access的网上选题系统设计与实现(毕业论文+程序源码)——网上选题系统

    基于asp+access的网上选题系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的网上选题系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开 ...

  9. asp毕业设计——基于asp+access的web人事管理系统设计与实现(毕业论文+程序源码)——人事管理系统

    基于asp+access的web人事管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的web人事管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  10. asp毕业设计——基于asp+access的毕业生信息管理系统设计与实现(毕业论文+程序源码)——毕业生信息管理系统

    基于asp+access的毕业生信息管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的毕业生信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

最新文章

  1. Science:Knight组发表尸体降解过程中的微生物组
  2. android设置光标闪烁,Android EditText闪烁光标
  3. (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致...
  4. python写出的程序如何给别人使用-涨姿势!这些小技巧让小白也可以写出更优雅的Python代码!...
  5. 自居电路(升压电路)
  6. 将游戏成绩传到排名页面html,用野狗开发实时游戏排行榜
  7. 数据结构与算法系列——从菜鸟到入门
  8. 搜狐2019第一季度总收入4.31亿超预期 减亏超预期
  9. python打乱列表的方法_python打乱列表
  10. EPLAN p8 安装失败解决办法
  11. 电大计算机绘图三锥图形,电大机械制图课程教学辅导
  12. 手势估计- Hand Pose Estimation
  13. [机缘参悟-39]:鬼谷子-第五飞箝篇 - 警示之二:赞美的六种类型,谨防享受赞美快感如同鱼儿享受诱饵。
  14. BZOJ 2565 最长回文串
  15. RK3399 HDCP 2.2key
  16. 【FXCG】纪律管理之入场及建仓原则
  17. python表示空类型的关键字_Python基本数据类型
  18. Python课程学习笔记 上
  19. 中国移动eSIM卡优势与申请流程
  20. wechaty搭建微信机器人——超详细版

热门文章

  1. My MPC·暴风影音 5.00_Stable
  2. 我理解的战争(程序员是需要有立场的)
  3. 新版一年级上册数学期末试卷
  4. 四维地球2.0上线,中国四维遥感云平台布局初见端倪
  5. FFmpeg源码分析:内存管理系统
  6. 【JQuery】动画
  7. 世界最快超级计算机 探秘天河一号
  8. python-机器学习-随机森林算法
  9. DS1302的使用方式 及 51单片机连接DS1302的驱动程序
  10. Arrays类——Arrays.asList()方法使用