浅谈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 相关文章推荐
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
cookie的复制与使用记住用户名实现代码
Nov 04 Javascript
javascript数组详解
Oct 22 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
移动手机APP手指滑动切换图片特效附源码下载
Nov 30 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
js实现统计字符串中特定字符出现个数的方法
Aug 02 Javascript
vue-router实现webApp切换页面动画效果代码
May 25 Javascript
Bootstrap Table快速完美搭建后台管理系统
Sep 20 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
Dec 24 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php四种定界符详解
2017/02/16 PHP
PHP Include文件实例讲解
2019/02/15 PHP
use jscript List Installed Software
2007/06/11 Javascript
$.ajax json数据传递方法
2008/11/19 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Python中print函数简单使用总结
2019/08/05 Python
Python如何实现的二分查找算法
2020/05/27 Python
如何学习Python time模块
2020/06/03 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
保险专业大专生求职信
2013/10/26 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
法制宣传月活动总结
2014/04/29 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
会计专业自荐信
2014/06/03 职场文书
新闻报道策划方案
2014/06/11 职场文书
如何写好竞聘报告
2019/04/03 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python