浅谈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 相关文章推荐
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
jquery ajax 同步异步的执行示例代码
Jun 23 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
javascript自定义函数参数传递为字符串格式
Jul 29 Javascript
JavaScript的ExtJS框架中表格的编写教程
May 21 Javascript
浅析jQuery Ajax通用js封装
Jun 22 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
JavaScript编写一个贪吃蛇游戏
Mar 09 Javascript
javascript 中Cookie读、写与删除操作
Mar 29 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
Apr 28 jQuery
JavaScript实现淘宝商品图切换效果
Apr 29 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连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
文本加密解密
2006/06/23 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
2012/10/29 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
python中使用print输出中文的方法
2018/07/16 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
windows10在visual studio2019下配置使用openCV4.3.0
2020/07/14 Python
用 python 进行微信好友信息分析
2020/11/28 Python
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
几个数据库方面的面试题
2016/07/01 面试题
教育学专业毕业生的自我评价
2013/11/21 职场文书
群教个人对照检查材料
2014/08/20 职场文书
2014年管理工作总结
2014/11/22 职场文书
劳模事迹材料范文
2014/12/24 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
投资入股协议书
2016/03/22 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书