浅谈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 相关文章推荐
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
Nov 07 Javascript
javascript生成随机数方法汇总
Nov 12 Javascript
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
Vue-component全局注册实例
Sep 06 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
Apr 24 Javascript
js仿360开机效果
Dec 26 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
JavaScript对象原型链原理详解
Feb 05 Javascript
JavaScript实现拖拽盒子效果
Feb 06 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 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
第五节--克隆
2006/11/16 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
PHP模拟asp中response类实现方法
2015/08/08 PHP
py文件转exe时包含paramiko模块出错解决方法
2016/08/12 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
Javascript中的this绑定介绍
2011/09/22 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
pandas 将索引值相加的方法
2018/11/15 Python
如何通过python实现全排列
2020/02/11 Python
Python如何读写二进制数组数据
2020/08/01 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
大学生专业个人学习的自我评价
2013/10/26 职场文书
住宅使用说明书
2014/05/09 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
电影建党伟业观后感
2015/06/01 职场文书
消费者投诉书范文
2015/07/02 职场文书
安全教育培训制度
2015/08/06 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python