js截屏以及three.js场景截屏

9 篇文章 0 订阅

做这个功能都是半个月之前的事情了,没想到一直耽误却一直都没有写下总结,尴尬。。。。。来来来,说正事

在手机端截屏完全不需要前端动什么脑子,但是在网页上截屏就很头疼了,我这里介绍两种情形,针对普遍和某一特殊功能需求

1、js截屏插件html2canvas.js

这个插件真的很好用,而且GitHub上的小星星也特别多,html2canvas官网   也给了详细的例子,最简单的就这样引用一个库文件,调用就可以将页面中的元素截图下来了。

但是这个插件原理是,将需要截图页面里面的元素一层一层遍历,然后在canvas中进行重绘,再将canvas转换成图片的过程。

注意事项:

  • 不支持iframe
  • 不支持跨域图片(可以先将线上图片转换成base64,然后用base64作为图片路径)
  • 不支持flash
  • 不支持transform、transition过渡、animation动画(备注:transform初始布局是可以的,但是不能参与动画类的操作)

html:

<div id="capture" style="padding: 10px; background: #f5da55">

    <h4 style="color: #000; ">Hello world!</h4>

</div>

 

js:

html2canvas(document.querySelector("#capture")).then(canvas => {

    document.body.appendChild(canvas)

});

2、js原生代码截屏

如果你只是要截取canvas里面的内容,那就很简单了。因为canvas原生的有toDataURL方法,可直接将选中的canvas转变为base64编码。因为我是用在three.js这个3d项目的场景里面,所以没用过这个库的朋友可能没遇到过bug。那就是截屏出来的图片是空白的,场景scene后期渲染的比如灯光,加载的模型都没有截图截下来。有两种方法

第一种是在渲染器开启preserveDrawingBuffer :true,即缓冲区保护-是否保存在缓冲区手动清除或覆盖,这个默认是false。开启之后,缓冲区的图像就不会被更新清除,就可以截取下来想要的图案。但问题也很明显,那就是在有动画或者后期渲染内容增加的时候,你的画面会变得很乱,内容被不断的叠加,因此我是建议大家使用第二种方法,这个方法说出来,只是为了让大家更加了解一下。

 

renderer = new WebGLRenderer({

antialias: true,

alpha: true,

preserveDrawingBuffer :true

})

第二种方法就是在截图之前先渲染一下场景和相机,就不会实时刷新屏幕,导致我们截屏下来的是空白了

let canvas=rederer.domElement

rederer.render(scene, camera)

var imgUri = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); // 获取生成的图片的url

window.location.href= imgUri // 下载图片

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果使用Canvas代码写,你可以使用Canvas 2D上下文的API来绘制倾斜的图像。你可以通过使用Canvas的transform()方法来旋转图像。 以下是一个使用Canvas绘制倾斜图像的示例代码: ``` <!DOCTYPE html> <html> <head> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="myCanvas" width="500" height="500"></canvas> <script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); // 背景图 var background = new Image(); background.src = "background.png"; background.onload = function() { ctx.drawImage(background, 0, 0, 500, 500); }; // 其他三张图片 var image1 = new Image(); image1.src = "image1.png"; image1.onload = function() { ctx.save(); ctx.translate(100, 100); ctx.rotate(20 * Math.PI / 180); ctx.drawImage(image1, 0, 0, 100, 100); ctx.restore(); }; var image2 = new Image(); image2.src = "image2.png"; image2.onload = function() { ctx.save(); ctx.translate(200, 200); ctx.rotate(30 * Math.PI / 180); ctx.drawImage(image2, 0, 0, 100, 100); ctx.restore(); }; var image3 = new Image(); image3.src = "image3.png"; image3.onload = function() { ctx.save(); ctx.translate(300, 300); ctx.rotate(40 * Math.PI / 180); ctx.drawImage(image3, 0, 0, 100, 100); ctx.restore(); }; </script> </body> </html> ``` 如果使用Three.js代码写,你可以使用Three.js创建一个3D场景,并在场景中绘制倾斜的图像。 以下是一个使用Three.js绘制倾斜图像的示例代码: ``` <!DOCTYPE html> <html> <head> <style> body ### 回答2: 可以通过使用three.js库来创建包含四张图片的截图,其中三张图片具有倾斜立体效果,而另一张则作为背景图。首先,需要导入three.js库并创建一个场景(scene)、相机(camera)和渲染器(renderer)。 然后,创建四个纹理贴图(texture)对象,分别对应四张图片。其中三张图片可以使用three.js提供的PlaneGeometry来创建平面(plane),然后将纹理贴图应用于这些平面。而背景图片可以使用three.js的CubeTextureLoader加载为一个立方体贴图,并将其应用于CubeGeometry。 接下来,将这四个平面添加到场景(scene)中,并设置它们的位置和旋转角度,以实现倾斜立体效果。 最后,使用渲染器(renderer)将场景(scene)以指定大小和比例渲染为一张图片,然后保存为文件或显示在屏幕上。 下面是一个示例代码片段,可以根据自己的需要进行修改和补充: ``` import * as THREE from 'three'; // 创建场景、相机和渲染器 const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 创建纹理贴图 const loader = new THREE.TextureLoader(); const texture1 = loader.load('image1.jpg'); const texture2 = loader.load('image2.jpg'); const texture3 = loader.load('image3.jpg'); const textureBackground = new THREE.CubeTextureLoader().load([ 'background_right.jpg', 'background_left.jpg', 'background_top.jpg', 'background_bottom.jpg', 'background_front.jpg', 'background_back.jpg' ]); // 创建平面和背景 const planeGeometry = new THREE.PlaneGeometry(1, 1); const plane1 = new THREE.Mesh(planeGeometry, new THREE.MeshBasicMaterial({ map: texture1 })); const plane2 = new THREE.Mesh(planeGeometry, new THREE.MeshBasicMaterial({ map: texture2 })); const plane3 = new THREE.Mesh(planeGeometry, new THREE.MeshBasicMaterial({ map: texture3 })); const backgroundPlane = new THREE.Mesh(new THREE.CubeGeometry(10, 10, 10), new THREE.MeshBasicMaterial({ map: textureBackground })); // 设置平面和背景的位置和旋转角度 plane1.position.x = -1; plane2.position.x = 1; plane3.position.y = 1; plane1.rotation.y = Math.PI / 4; plane2.rotation.x = Math.PI / 6; plane3.rotation.z = Math.PI / 3; // 将平面和背景添加到场景中 scene.add(plane1); scene.add(plane2); scene.add(plane3); scene.add(backgroundPlane); // 渲染场景 function animate() { requestAnimationFrame(animate); renderer.render(scene, camera); } animate(); ``` 以上代码片段使用了three.js来创建四张图片的截图,其中三张图片具有倾斜立体效果,而背景图则作为立方体贴图设置在背景上。你可以通过修改代码中的图片路径和位置/旋转参数来适应你的需求。 ### 回答3: 要使用canvas代码或three.js代码创建包含四张图片的截图,其中三张图片具有倾斜立体效果,另一张是背景图。以下是使用HTML5的canvas代码实现的示例: 首先,我们需要在HTML中创建一个canvas元素和背景图像的img元素: ```html <canvas id="myCanvas"></canvas> <img id="background" src="background.jpg" style="display: none;"> ``` 接下来,我们可以使用JavaScript来编写绘制图像的代码: ```javascript var canvas = document.getElementById("myCanvas"); var context = canvas.getContext("2d"); // 加载背景图 var background = new Image(); background.src = document.getElementById("background").src; background.onload = function() { // 绘制背景图 context.drawImage(background, 0, 0, canvas.width, canvas.height); // 加载并绘制立体效果的图像 var image1 = new Image(); image1.src = "image1.jpg"; image1.onload = function() { context.save(); context.transform(1, -0.5, 0, 1, 50, 50); // 调整图像1的倾斜效果 context.drawImage(image1, 0, 0, 100, 100); context.restore(); }; var image2 = new Image(); image2.src = "image2.jpg"; image2.onload = function() { context.save(); context.transform(1, 0, 0.5, 1, 200, 50); // 调整图像2的倾斜效果 context.drawImage(image2, 0, 0, 100, 100); context.restore(); }; var image3 = new Image(); image3.src = "image3.jpg"; image3.onload = function() { context.save(); context.transform(1, 0.2, -0.2, 1, 350, 50); // 调整图像3的倾斜效果 context.drawImage(image3, 0, 0, 100, 100); context.restore(); }; }; ``` 以上代码中,我们首先绘制背景图像,然后分别加载并绘制具有不同倾斜效果的图像1、2和3。 请确保将背景图像、图像1、图像2和图像3替换为您自己的图像文件路径。 此代码将在canvas上创建一张截图,其中包含4张图片,其中3张具有倾斜立体效果,剩下的一张是背景图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值