【发布时间】:2018-11-04 20:47:04
【问题描述】:
** 编辑 ** 我必须导出一个大画布(5Mo
当我导出画布(使用 toDataUrl)时,它总是返回一个带有 alpha 通道的 .png 文件的 base64 表示。 Alpha 通道权重约为图像数据的 25%,我不需要它。
建议答案:
- PNG 压缩效果很好。如果 alpha 通道是平坦的(都是相同的值),那么它不会占用太多空间。 即使使用完全不透明的 Alpha 通道,(压缩的).png 文件也会更大。 (在一些测试中大约 +10%)。
- 你应该在画布之前填充画布(使用你想要的背景颜色)。 我已经在stackoverflow上建立了这个解决方案,但它似乎不起作用
- Base64 编码增加了 34% 的字节。已经解决了。使用这个 解决方案:convert-data-uri-to-file-then-append-to-formdata (一个 Uint8Array 变成一个 Blob 变成一个 FormData)
有没有办法将我的画布导出为 .png 但没有 alpha 通道? 如果“否”,javascript中有没有办法(lib)修剪alpha通道? 导出为 .jpeg 不是解决方案,我需要一个 .png 文件。
谢谢! :)
【问题讨论】:
-
我只会将此作为评论发布,因为我不是 100% 确定,但我会说不要屏住呼吸。我尽我所能在 MDN 上进行了检查,没有迹象表明有这样的选择。您可以尝试使用
getImageData(),将颜色值提取到新的ArrayBuffer,然后使用客户端库进行压缩(NPM 可能有一些有用的东西)。我不知道与实际的 .png 压缩相比会产生什么大小,但考虑到数据 URL 是 base64 编码的,它总是大于它的二进制形式,它可能与你的大小相当,甚至更好。 -
显然,在这种情况下,后端必须准备好接收这种非标准格式的图像。
-
我还没有尝试过这个解决方案。我希望找到另一种解决方案,而不是解析整个 png 文件,提取 RGB 值,然后重新创建一个没有 alpha 通道的 png
标签: javascript canvas png transparency todataurl