You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在onload函数中返回值,解决base64SquareCrop返回undefined问题

base64SquareCrop函数返回undefined问题修复

问题根因

  • 异步执行逻辑错误:img.onload是异步回调函数,回调内部的return只会返回给回调本身,外层的base64SquareCrop函数不会等待onload触发就已经执行完毕,自然拿不到返回值
  • 无效await:img.setAttribute是同步方法,返回值为undefined,await操作没有任何实际作用,并没有等待图片加载完成
  • 静态宽高写死:原代码里宽高固定为1240/698,没有读取实际加载的图片尺寸,会导致裁剪比例错误
  • 未声明canvas对象:原代码直接使用canvasImage,如果全局没有提前定义会抛出引用错误

修复后代码

async function base64SquareCrop(imgbase64, size = 224) {
  // 创建图片和画布对象
  const img = document.createElement("img");
  const canvasImage = document.createElement("canvas");
  // 若需要处理跨域图片可放开下面注释
  // img.crossOrigin = 'anonymous';

  // 用Promise包裹异步逻辑,加载完成后返回结果
  return new Promise((resolve, reject) => {
    img.onload = function() {
      // 读取图片实际尺寸
      const width = img.naturalWidth;
      const height = img.naturalHeight;
      const min = Math.min(width, height);
      const scale = size / min;
      const scaledW = Math.ceil(width * scale);
      const scaledH = Math.ceil(height * scale);
      const dx = scaledW - size;
      const dy = scaledH - size;

      canvasImage.width = canvasImage.height = size;
      const ctx_img = canvasImage.getContext("2d");
      ctx_img.drawImage(
        img,
        ~~(dx / 2) * -1,
        ~~(dy / 2) * -1,
        scaledW,
        scaledH
      );
      resolve(canvasImage.toDataURL("image/png"));
    }
    // 加载失败异常捕获
    img.onerror = reject;
    // src赋值放在onload绑定后,避免缓存图片触发onload时回调未绑定
    img.src = imgbase64;
  })
}

使用方式

调用时直接await函数即可拿到裁剪后的base64结果:
const croppedImg = await base64SquareCrop(原始base64, 目标尺寸)

内容的提问来源于stack exchange,提问作者H S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:06:05