最近在项目中遇到这样一个需求,用户生成推广海报想要发送给朋友,但是推广海报是用html网页写的,这时候想要分享给朋友的话只能用户自己手机截图,显然这样的用户体验是不友好的,如果可以给用户一个按钮实现一键截图的功能,那么便极大地方便了用户,有可能就是因为省了这一步而使得推广的效果变得更好。下面就讲一下如何使用java实现屏幕截屏的功能。

第一步:创建截屏工具类

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO; /**
* 截屏工具类
* @author zhangdi
*
*/
public class CutPicUtil { /**
* 屏幕截图
* @param imageName 存储图片名称
* @param path 图片路径
* @param imgType 图片类型
* @throws AWTException
* @throws IOException
*/
public static void cutPic(String imageName,String path,String imgType) throws AWTException, IOException{
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(screenRectangle);
ImageIO.write(image,imgType, new File(path+imageName+"."+imgType));
} }

第二步:在服务层调用截图工具类

    @Override
public Map<String, Object> ScreenshotImg(String imageName, String basePath,String path,
String imgType) {
Map<String, Object> map = new HashMap<String, Object>();
boolean flag = true;
String name = DateUtil.getNowDate(6)+RandomUtil.getRandomString(8);
try {
CutPicUtil.cutPic(name, basePath+path,imgType);
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
if(flag){
map.put("state","0");//截屏成功
map.put("path",path+name+"."+imgType);
}else{
map.put("state","1");//截屏失败
}
return map;
}

第三步:在控制层提供接口

    /**
* 屏幕截图
* @return
*/
@RequestMapping(value="cutPic" ,method=RequestMethod.POST)
@ResponseBody
public Map<String, Object> cutPic(HttpServletRequest request){
String imageName = DateUtil.getNowDate(6)+RandomUtil.getRandomString(6);
String basePath = request.getRealPath("/");
String path = "/static/img/Screenshotimg/";
return iManageService.ScreenshotImg(imageName,basePath,path, "jpg");
}

第四步:前台页面调用接口(这里使用原生js调用)

    <img id="jietu" width="300px" height="180px"></br>
<button id="jt">截屏</button>
<script type="text/javascript">
$("#jt").click(function(){
$.ajax({
url:"router/cutPic",
type:"post",
data:{},
success:function(data){
if(data.state=="0"){
alert("截屏成功");
$("#jietu").attr("src","/wxactive"+data.path);
}else{
alert("截图失败");
}
window.clearInterval(timer);
console.log(data);
},
error:function(e){
alert("错误!!");
window.clearInterval(timer);
}
});
});
</script>

效果:点击截屏提示截屏成功并展示出来

注意:我这里是跟springMVC结合使用的,其实核心代码是截图工具类,大家可以选择性的使用。

java实现屏幕截屏功能的更多相关文章

  1. Java实现网页截屏功能(基于phantomJs)

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...

  2. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  3. Android自己定义截屏功能,相似QQ截屏

    由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...

  4. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制 ...

  5. DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)

    写在前面 最近有这么一个需求,分享页面,分享的是web订单截图,既然是web 就会有超出屏幕的部分, 生成的图片还要加上我们的二维码,这就涉及到图片的合成了. 有了这样的需求,就是各种google.也 ...

  6. 【玩转cocos2d-x之三十九】Cocos2d-x 3.0截屏功能集成

    3.0的截屏和2.x的截屏基本上同样.都是利用RenderTexture来处理,在渲染之前调用call函数,然后调用Cocos的场景visit函数对其进行渲染,渲染结束后调用end函数就可以.仅仅是3 ...

  7. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...

  8. 小胖说事22-----iOS开发技巧之取消键盘响应和截屏功能

    1.UILable内容模糊 在非Retina的iPad mini 的屏幕上,一个UILable的frame的origin值假设是有小数位(如0.5),就会造成显示模糊,所以不妨用整数值的origin. ...

  9. c# wpf 利用截屏键实现截屏功能

    原文:c# wpf 利用截屏键实现截屏功能     最近做一个wpf程序需要截图功能,查找资料费了一些曲折,跟大家分享一下.     先是找到了这样一份代码:     static class Scr ...

随机推荐

  1. vgg16中的函数

    1.inspect.getfile(文件名)文件名一般与类名相同,返回文件目录包含文件名 import inspect class os测试: def __init__(self): path = i ...

  2. sem_init重复调用引发sem_wait线程无法被唤醒

    问题 一段老代码,两个线程,一个线程调用sem_wait等待信号量,另外一个线程在某失败分支会调用sem_init清信号量,结果导致sem_wait线程无法被唤醒: 分析 Linux manpage ...

  3. 使用 concurrently 并行地运行多个命令(同时跑前端和后端的服务)

    我现在有一个项目是这样的,前端是用 React 写的,后端是用 Nodejs,目录结构如下: . ├── README.md ├── backend ├── node_modules ├── pack ...

  4. Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softma

      import numpy as np from matplotlib import pyplot as plt # 创建线性回归数据集 def create_dataset(): X = 2 * ...

  5. 文献阅读 | Benchmarking single cell RNA-sequencing analysis pipelines using mixture control experiments

    资源: sci-hub paper CellBench package - github CellBench_data - code for the paper 现在单细胞领域的突出问题就是工具过多, ...

  6. 信息论 | information theory | 信息度量 | information measures | R代码(一)

    这个时代已经是多学科相互渗透的时代,纯粹的传统学科在没落,新兴的交叉学科在不断兴起. life science neurosciences statistics computer science in ...

  7. RecyclerView 实现快速滚动 (转)

    RecyclerView 实现快速滚动 极小光  简书作者   简评:Android Support Library 26 中终于实现了一个等待已久的功能:RecyclerView 的快速滚动. An ...

  8. GB28181技术基础之3 - RTP

    一. RTP协议 实时传输协议 RTP(Real-time Transport Protocol)是一个网络传输协议,它是由IETF的多媒体传输工作小组1996年在RFC 1889中公布的,后在RFC ...

  9. 新一代互联网传输协议QUIC

    QUIC(Quick UDP Internet Connections,快速UDP互联网连接)是Google提出的一种基于UDP改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验. Q ...

  10. Microservices in action: java(spring) and .net

    Manning | Homehttps://www.manning.com/ What is a Microservice? | Manninghttps://freecontent.manning. ...