浅谈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变量、作用域及内存详解
Sep 23 Javascript
Javascript访问器属性实例分析
Dec 30 Javascript
jQuery实现按钮的点击 全选/反选 单选框/复选框 文本框 表单验证
Jun 25 Javascript
JavaScript中关联原型链属性特性
Feb 13 Javascript
Bootstrap每天必学之导航组件
Apr 25 Javascript
Jquery元素追加和删除的实现方法
May 24 Javascript
js创建对象几种方式的优缺点对比
Sep 28 Javascript
JS访问DOM节点方法详解
Nov 29 Javascript
JavaScript简单实现的仿微博留言功能示例
Jan 17 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
Sep 24 Javascript
移动端JS实现拖拽两种方法解析
Oct 12 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
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连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php随机显示图片的简单示例
2014/02/15 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
eclipse php wamp配置教程
2016/06/30 PHP
php实用代码片段整理
2016/11/12 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
2014/09/04 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
vc6编写python扩展的方法分享
2014/01/17 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python简单文本处理的方法
2015/07/10 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
澳大利亚网上书店:QBD
2021/01/09 全球购物
CAD制图人员的自荐信
2014/02/07 职场文书
庆元旦广播稿
2014/02/10 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
2015年班长个人工作总结
2015/04/03 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
SpringBoot详解执行过程
2022/07/15 Java/Android