浅谈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之ESC(第二类混淆)
May 06 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
Mar 25 Javascript
基于jQuery选择器的整理集合
Apr 26 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
让复选框只能选择一项的方法
Oct 08 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
Svg.js实例教程及使用手册详解(一)
May 16 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
详解node单线程实现高并发原理与node异步I/O
Sep 21 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 日期加减的类,很不错
2009/10/10 PHP
php若干单维数组遍历方法的比较
2011/09/20 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
php防止sql注入的方法详解
2017/02/20 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
简述Python中的面向对象编程的概念
2015/04/27 Python
Python实现栈的方法
2015/05/26 Python
Django中Model的使用方法教程
2018/03/07 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
python中threading开启关闭线程操作
2020/05/02 Python
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
财务工作个人求职的自我评价
2013/12/19 职场文书
企业宣传工作方案
2014/06/02 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
申报材料格式
2014/12/30 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫