浅谈Three.js截图并下载的大坑


Posted in Javascript onNovember 01, 2019

最近做有关three.js的动画,想通过截图然后在新的页面打开截图,并且想把图片下载到本地,连环坑很ok:ok_hand:嗯。这个必须要记下来!

先来看看普通页面的截图

一开始看到这个,完全没思路,普通的html标签要怎么才能变成一张图???,其实嘞,目前的截图方案都并不是我们理解的那种截图,不管是使用canvas还是svg,其实都是做了转化,但是这两种方法都不在这详细描述了,有兴趣的可以看看这篇,说的很详细了(canvas VS svg 截图),然鹅,肯定是有工具的啦,那就是git上开源的 html2canvas ,有好多小星星呀,并且使用超简单,但是原理也是将html的标签重新绘制到canvas中,其中也有很多不能解决的问题,比如什么文本阴影啊,竖版图片啊之类的,还有!!动画元素截取不出来!!!!!,截屏出来是白屏。

怎么解决嘞

为什么是白屏:

截取three.js 渲染的图,如果直接将输出的canvas变成图片是无法获取的,因为在获取之前渲染界面是清空的状态,所以需要在渲染之后清空之前将渲染的内容转换为图片,即将场景的内容渲染一遍并将渲染的内容转为图片数据。

解决方案:

shot(){
   let image = new Image();
   renderer.render(scene, camera);//renderer为three.js里的渲染器,scene为场景 camera为相机

   let imgData = renderer.domElement.toDataURL("image/jpeg");//这里可以选择png格式jpeg格式
   image.src = imgData;
   document.body.appendChild(image);//这样就可以查看截出来的图片了
}

划重点:

其实就是相当于渲染一帧,并把这一帧输出 而如果需要截某个部分的图片,只需要将相机变一下,换成自己想要范围,并渲染一帧再截屏出来。 优点非常明显, 这样相当于重新渲染一帧,即便是截取某个很小的部分,截取的图片也是很清晰的。

截完图之后嘞

我想要的呢是将截的图展示在新的页面上,可是生成的图片并不是base64的码,所以我们要将渲染的canvas转化为base64的图片,toDataURL可以直接做到,然后展示在新窗口就好啦。

function debugBase64(base64URL){
  let win = window.open();
  win.document.write('<image id="IframeReportImg" src="' + base64URL + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen ></image>');
  }

图片下载

还是基于浏览器的功能去操作的

function downloadImage(imgUrl) {
  let a = $("<a></a>").attr("href", imgUrl).attr("download", "img.png").appendTo("body");
  a[0].click();
  a.remove();
  }

其中的imgUrl就是我们之前转好的码,也就是

let imgData = renderer.domElement.toDataURL("image/jpeg");/

这里的imgData。

完成啦

源码在这

浅谈Three.js截图并下载的大坑

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript下function声明一些小结
Dec 28 Javascript
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
修改jquery.lazyload.js实现页面延迟载入
Dec 22 Javascript
document.createElement()用法及注意事项(ff下不兼容)
Mar 13 Javascript
JQuery1.8 判断元素是否绑定事件的方法
Jul 10 Javascript
javascript实现动态表头及表列的展现方法
Jul 14 Javascript
原生JS实现拖拽图片效果
Aug 27 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
vue.js入门教程之计算属性
Sep 01 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
Nov 21 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
Dec 20 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 Javascript
vue中使用vee-validator完成表单校验方案
Nov 01 #Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 #Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 #Javascript
js new Date()实例测试
Oct 31 #Javascript
一起写一个即插即用的Vue Loading插件实现
Oct 31 #Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 #Javascript
vue路由切换之淡入淡出的简单实现
Oct 31 #Javascript
You might like
如何开发一个虚拟域名系统
2006/10/09 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
自定义jQuery选项卡插件实例
2013/03/27 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
JS获取url参数、主域名的方法实例分析
2016/08/03 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
[04:03][TI9趣味短片] 小鸽子茶话会
2019/08/20 DOTA
python实现sublime3的less编译插件示例
2014/04/27 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python 使用多属性来进行排序
2019/09/01 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
python简单实现最大似然估计&amp;scipy库的使用详解
2020/04/15 Python
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
班班通项目实施方案
2014/02/25 职场文书
优秀实习生感言
2014/03/01 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
大学生学年个人总结
2015/02/15 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL