浅谈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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
jquery中:input和input的区别分析
Jul 13 Javascript
基于js与flash实现的网站flv视频播放插件代码
Oct 14 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
Aug 21 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
AngularJS 文件上传控件 ng-file-upload详解
Jan 13 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
JavaScript门面模式详解
Oct 19 Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
基于javascript的无缝滚动动画1
Aug 07 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
亲密接触PHP之PHP语法学习笔记1
2006/12/17 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
php实现概率性随机抽奖代码
2016/01/02 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
PHP7 list() 函数修改
2021/03/09 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JavaScript的parseInt 进制问题
2009/05/07 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
Python读取excel中的图片完美解决方法
2018/07/27 Python
Python实现的简单计算器功能详解
2018/08/25 Python
学习Python列表的基础知识汇总
2020/03/10 Python
pandas分批读取大数据集教程
2020/06/06 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
会计专业大学生职业生涯规划书
2014/02/11 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
整改报告格式
2014/11/06 职场文书
讲座新闻稿
2015/07/18 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis