美文网首页
Three.js截图并下载的大坑。。。

Three.js截图并下载的大坑。。。

作者: 977777 | 来源:发表于2019-05-13 23:26 被阅读0次

    最近做有关three.js的动画,想通过截图然后在新的页面打开截图,并且想把图片下载到本地,连环坑很ok👌嗯。这个必须要记下来!

    先来看看普通页面的截图

    一开始看到这个,完全没思路,普通的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截图并下载的大坑。。。

          本文链接:https://www.haomeiwen.com/subject/ggmdaqtx.html