浅谈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实现下载远程文件并保存在本地的脚本
May 06 Javascript
javascript 事件绑定问题
Jan 01 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
Aug 25 Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
Oct 09 Javascript
Bootstrap禁用响应式布局的实现方法
Mar 09 Javascript
js轮播图的插件化封装详解
Jul 17 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
基于 D3.js 绘制动态进度条的实例详解
Feb 26 Javascript
详解JavaScript中分解数字的三种方法
Jan 05 Javascript
简单聊聊TypeScript只读修饰符
Apr 06 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和ACCESS写聊天室(二)
2006/10/09 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
优秀民警事迹材料
2014/01/29 职场文书
女子职高个人自荐书
2014/02/01 职场文书
一名老师的自我评价
2014/02/07 职场文书
优秀管理者获奖感言
2014/02/17 职场文书
生物制药专业求职信
2014/03/11 职场文书
总结表彰大会主持词
2014/03/26 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
2014年司法局工作总结
2014/12/11 职场文书
介绍信怎么写
2015/01/30 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
关于幸福的感言
2015/08/03 职场文书
早恋主题班会
2015/08/14 职场文书
班级管理经验交流材料
2015/11/02 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书