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

使用PreloadJS预加载图片后克隆报错,如何获取Base64 URL?

问题:PreloadJS预加载图片后克隆Blob格式图片报错,如何转为Base64并保留克隆功能?

问题场景

使用PreloadJS预加载图片后,获取到的<img>元素src为Blob格式(如blob:http://localhost:8080/xxx),调用cloneNode(true)克隆该元素并添加到容器时,出现资源找不到的错误:

blob:http://localhost:8080/70b2d643-5a19-43a3-8f69-708eff4bca9e:1
GET blob:http://localhost:8080/70b2d643-5a19-43a3-8f69-708eff4bca9e net::ERR_FILE_NOT_FOUND

相关代码:
预加载配置:

this.m_queue.loadFile({id: 'logo', src: 'res/img/logo/logo.png'});

获取预加载资源:

const PreloadedAssets = {
    logo: null,

    initializeMisc(loadQueue) {
        PreloadedAssets.logo = loadQueue.getResult('logo');
        console.log(PreloadedAssets.logo); // 输出为<img src="blob:...">
    }
}

克隆图片的代码:

let logo = PreloadedAssets.logo.cloneNode(true);
logo.style.transition = 'opacity 0.5s';
logo.style.opacity = '0';
logo.style.position = 'absolute';
logo.style.left = `${ProjectSettings.centerX(logo.offsetWidth)}px`;
logo.style.top = `${ProjectSettings.centerY(logo.offsetHeight) - 200}px`;
this.container.appendChild(logo);

错误原因

Blob URL是浏览器为临时Blob资源生成的专属URL,仅在当前文档上下文且Blob资源未被释放时有效。PreloadJS内部可能会在预加载完成后清理Blob缓存,或者克隆元素引用的URL绑定的原Blob资源被回收,导致克隆元素无法访问该URL,从而出现404错误。


解决方案:将Blob图片转为Base64 DataURL

Base64是内嵌的图片数据,不存在临时URL失效的问题,克隆后可正常使用。在预加载完成后,将Blob格式的图片转换为Base64格式即可:

修改initializeMisc方法,添加转换逻辑:

const PreloadedAssets = {
    logo: null,

    initializeMisc(loadQueue) {
        const blobImg = loadQueue.getResult('logo');
        // 创建Canvas用于转换图片格式
        const canvas = document.createElement('canvas');
        canvas.width = blobImg.width;
        canvas.height = blobImg.height;
        const ctx = canvas.getContext('2d');
        // 将Blob图片绘制到Canvas
        ctx.drawImage(blobImg, 0, 0);
        // 导出为Base64格式的DataURL(可指定格式,默认是image/png)
        const base64Url = canvas.toDataURL('image/png');
        // 创建新的Image元素,赋值Base64 URL
        const base64Img = new Image();
        base64Img.src = base64Url;
        // 同步原图片的宽高属性
        base64Img.width = blobImg.width;
        base64Img.height = blobImg.height;
        // 替换为Base64格式的图片
        PreloadedAssets.logo = base64Img;
    }
}

之后再使用cloneNode(true)克隆PreloadedAssets.logo,就不会出现资源找不到的问题了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:50:24