1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 【java毕业设计】基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)——屏

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

时间:2023-10-19 02:51:00

相关推荐

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

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

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

文章目录:

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

1、项目简介

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

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

基于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_'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+制作屏幕截图小软件.图形图像处理(23期)

[3] 张之.QQ屏幕截图的秘密.CFan加油站 (10期).

[4] 吴颂涛;张瑶.电视直播截屏系统及方法. 电视中心 (12期)

[5] 王志军.善用PowerPoint的截图工具. 办公与应用 (12期).

[6] 何昭友;.WINCE下屏幕截图与为徒转换.瓦斯灾害监控与应急技术国家重点实验室;中国煤炭科工集团重庆研究院;.

[7] 庞赫;基于Windows图形驱动的屏幕截图技术.石家庄市外国语学校: 新技术(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, , 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, , 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, , Vol.23 (4)


5、源码下载:

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。