java使用代理 html2canvas 截屏 将页面内容生成图片
1、html2canvas 生成图片简单又好用,但涉及到跨域就会出现问题,官方给出的解决办法是设置代理。基本原理就是在后端将图片的数据生成base64再返回给前端使用。使canvas画布分析元素的时候像分析本地的一样简单。这就是我的理解。官网给出的只有php的方法,我是照扒了一般java的出来。有写的不好的地方,欢迎大家指正。废话不多说了,先上代码。
@RequestMapping(value="/proxy", method = RequestMethod.GET)
public void getJwd(HttpServletRequest request,HttpServletResponse response){
String url = request.getParameter("url");
String callback = request.getParameter("callback");
if(url != "" && callback != ""){
try {
URL urlInfo = new URL(url);
if(urlInfo.getProtocol().equals("http") || urlInfo.getProtocol().equals("https")){
HttpURLConnection conn = (HttpURLConnection) urlInfo.openConnection();
String contentType = conn.getContentType();
if(contentType.equals("image/png") || contentType.equals("image/jpg") || contentType.equals("image/jpeg") || contentType.equals("image/gif") || contentType.equals("text/html") || contentType.equals("application/xhtml")){
if(request.getParameter("xhr2") != null){
response.setHeader("Access-Control-Allow-Origin", "*");
response.setContentType(contentType);
DataInputStream input = new DataInputStream(conn.getInputStream());
BufferedOutputStream bout = new BufferedOutputStream(response.getOutputStream());
try {
byte b[] = new byte[1024];
int len = input.read(b);
while (len > 0) {
bout.write(b, 0, len);
len = input.read(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
bout.close();
input.close();
}
}else{
response.setContentType("application/javascript");
if(contentType.equals("text/html") || contentType.equals("application/xhtml")){
}else{
// 获取数据流生成byte字节
DataInputStream input = new DataInputStream(conn.getInputStream());
input.toString();
byte[] buffer = new byte[1024 * 8]; ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1024 * 8];
int n;
while ((n = input.read(b)) != -1) {
bos.write(b, 0, n);
}
input.close();
bos.close();
buffer = bos.toByteArray();
// 将byte转成base64
BASE64Encoder encode = new BASE64Encoder();
String base64data = encode.encode(buffer);
base64data = base64data.replaceAll("\r\n","");
response.getWriter().write(callback+"('"+ "data:" + contentType + ";base64," + base64data +"')");
}
} }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2、前端调用的代码如下:
html2canvas(document.getElementById("aaaaaaa"), {
"logging": true, //Enable log (use Web Console for get Errors and Warnings)
"proxy": basePath + "canvas/proxy.do",
"onrendered": function(canvas) {
var img = new Image();
img.crossOrigin = "*";
img.onload = function() {
img.onload = null;
//document.body.appendChild(img);
$("#Screenshot_show").append(img);
};
img.onerror = function() {
img.onerror = null;
if(window.console.log) {
window.console.log("Not loaded image from canvas.toDataURL");
} else {
alert("Not loaded image from canvas.toDataURL");
}
};
img.src = canvas.toDataURL("image/png");
}
});
总之就是这样子了,算是蛮简单的例子吧。
最后,附上我上传到scdn的例子
http://download.csdn.net/download/shuangwj/9561348
java使用代理 html2canvas 截屏 将页面内容生成图片的更多相关文章
- html2canvas将页面内容生成图片
html2canvas官网链接地址:https://html2canvas.hertzen.com/ <!doctype html> <html lang="en" ...
- html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示
1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...
- vue中使用html2canvas及解决html2canvas截屏图片模糊问题
最近在项目中用到了html2canvas插件,遇到的一些坑写下来,与大家共勉. html2canvas 官方网站http://html2canvas.hertzen.com/index.html 这 ...
- html2canvas截屏用法
<!DOCTYPE html><html lang="en"><head> <meta charset="utf-8" ...
- html2canvas 截屏 兼容手机端
<template> <div> <!--<input type="button" id="btnsavaImg" valu ...
- Java实现网页截屏功能(基于phantomJs)
公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...
- iOS应用截屏
iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求.比如,我们开发了一个播放器,用openGL进行video render,此时直接截 ...
- Android 获取浏览器当前分享页面的截屏
Android 获取浏览器当前分享页面的截屏 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/BrowserScreenShotActivity 文中 ...
随机推荐
- IE6不支持min-heightt和min-width的解决办法
IE6不支持min-height的解决办法 最小高度min-height是很有用的,但IE6却不支持.真烦人.有没有办法呢? 我们可以利用IE6不识别!important来实现: height:aut ...
- python opencv 实现Reinhard颜色迁移算法
Reinhard颜色迁移算法的过程很简单,流程如下,细节部分见原文,题目为color transfer between images: 将参考图片和目标图片转换到LAB空间下 得到参考图片和目标图片的 ...
- Breeze库API总结(Spark线性代数库)(转载)
导入 import breeze.linalg._ import breeze.numerics._ Spark Mllib底层的向量.矩阵运算使用了Breeze库,Breeze库提供了Vector/ ...
- javascript - 可编辑表格控件 支持全键盘操作(无JS框架)
项目中经常会用到表格编辑控件,网上也有不少,但是确实没有完全符合我要求的, 自己写一个吧! 1.该控件支持 数据显示列,文本编辑列,选择列,下拉列,索引列,删除列 六种列类型 2.支持全键盘操作,自定 ...
- python :开关,开灯关灯
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 使用IO流实现一个简单的小Dome
(一) 在电脑D盘下创建一个文件为HelloWorld.txt文件,判断他是文件还是目录,在创建一个目录IOTest,之后将HelloWorld.txt移动到IOTest目录下去:之后遍历IOTest ...
- Android动态方式破解apk终极篇(加固apk破解方式)
一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应 ...
- CentOS 7 最小化安装的无线网络配置
1.首先下载iw工具. yum -y install iw 2.获取无线网卡的名称 执行iw dev,假设获得名称为 wlp3s0(示例) 3.激活无线网络接口 执行ip link set wlp3s ...
- C# 只移除最后一个字符
string str = "|||"; Console.WriteLine(str.Substring(0, str.Length - 1)); Console.WriteLine ...
- dispatch a action with a timeout
程序入口文件添加依赖: import { createStore, applyMiddleware } from 'redux' import thunk from 'redux-thunk' // ...