怎么把Threejs的canvas转成为图像?

Number of views 63

我有一个Three.js 的画布,怎么从中保存为一张图片呢?

用了 Canvas2Image,但它貌似和 Three.js 不太兼容。因为它的父级必须有个div节点?

1 Answers

要将Three.js的Canvas转换成图像,你可以使用HTML5 Canvas API中的toDataURL()方法。这种方法不需要依赖外部库如Canvas2Image,并且可以直接在Three.js场景中使用。

以下是一个简单的示例代码:

function saveAsImage() {
    // 获取渲染器的domElement(即Canvas)
    const canvas = renderer.domElement;

    // 使用toDataURL()方法将Canvas内容转换为数据URL
    const dataUrl = canvas.toDataURL('image/png');

    // 创建一个a标签用于下载
    const link = document.createElement('a');
    link.href = dataUrl;
    link.download = 'threejs-image.png';
    
    // 将a标签添加到DOM并触发点击事件以开始下载
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

在这个例子中: 1. renderer.domElement 获取了Three.js渲染器中的Canvas元素。 2. toDataURL('image/png') 方法将Canvas内容转换为PNG格式的数据URL。 3. 创建一个<a>标签并设置其href属性为数据URL,然后触发点击事件以下载图像。

确保你的Three.js渲染器已正确初始化并且已经渲染了一帧,以便在调用saveAsImage函数时可以获取最新的Canvas内容。

如果需要JPEG格式或其他格式,只需更改toDataURL方法中的参数即可,例如 'image/jpeg'

验证后发现得为WebGL Canvas的Context上下文设置preserveDrawingBuffer: true才能用ai提供的方法,在threejs中就是

new THREE.WebGLRenderer({
    preserveDrawingBuffer: true 
});

不过说是会影响性能,查了下,可能是某些web mobile的机型下面