如果您查看此代码,webp 的表现优于 png 和 jpg
<canvas id="canvas"></canvas>
<script>
var ctx = canvas.getContext("2d");
ctx.fillStyle = "red";
ctx.fillRect(0, 0, 8, 8);
var webp = canvas.toDataURL("image/webp"); // Chrome only?
var png = canvas.toDataURL("image/png");
var jpg = canvas.toDataURL("image/jpeg");
console.log(webp.length, webp); // 263 byte
console.log(png.length, png); // 1918 byte
console.log(jpg.length, jpg); // 1938 byte
document.body.appendChild(new Image).src = webp;
document.body.appendChild(new Image).src = png;
document.body.appendChild(new Image).src = jpg;
</script>
我正在使用节点模块https://github.com/Automattic/node-canvas
它不支持 webp,但它确实模拟了 canvas 元素
我认为我需要的是围绕这个画布做一个包装
wrapper(canvas).toDataURL('image/webp');
正如我在许多尝试中发现的那样,将 base64 png 图像从 png 转换为 webp 只是速度很差。
webp 将是通过 websocket 快速传输的理想大小。如果不支持 webp,那么我会回退到 png 并且用户的体验会变慢。
原始问题:
在 node.js 中,我需要一种将字符串从 base64 png 转换为 base64 webp 的方法。
我说字符串是因为我的应用程序的性质。如果我要保存这些特定图像然后转换它们(有一些 npm 模块可以转换图像“文件”),我的服务器将充满图像,因为这些图像对于每个用户来说都是临时的和动态的,每个用户在移动页面时会获得大约 100 张新图像。
在节点画布canvas.toDataURL('image/webp')
中不支持仅图像/PNG