当 canvas.toBlob() 无法编码你请求的格式时,可能会静默地返回一个 PNG 图像

发布日期:2026-07-28 10:03:46  浏览量 :0
发布日期:2026-07-28 10:03:46  
0

我正在构建一个小型的浏览器内图像转换工具——拖入一个 PNG 或 JPEG 文件,即可得到 WebP 或 AVIF 格式的文件,全程无需服务器参与——却遇到了一种看起来根本不像失败的失败模式。转换“成功”了。下载也正常。但文件并不是你所要求的格式,除非你特意检查,否则你永远不会知道。

问题的本质

在客户端执行此操作的全部意义在于,图像永远不会离开浏览器。没有上传,没有服务器往返,没有队列。处理流程很短:

const loadBitmap = async (file: File) => {
  if ('createImageBitmap' in window) return createImageBitmap(file);
  return new Promise<HTMLImageElement>((resolve, reject) => {
    const image = new Image();
    image.onload = () => resolve(image);
    image.onerror = reject;
    image.src = URL.createObjectURL(file);
  });
};

createImageBitmap(file) 是快速路径——它在主线程之外解码文件,而无需你先连接一个 <img> 元素。不过,并非所有环境都支持它,因此有一个回退方案,即使用经典的 new Image() 加上 URL.createObjectURL,这种方法在任何地方都有效,但在解码期间会占用主线程。

一旦你获得了位图,就将其绘制到画布中——可以选择缩小尺寸——然后请求画布生成目标格式的 blob 数据:

const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height 

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

分享到:

长按或扫码识别 分享给好友

长按或扫码识别 分享给好友
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据