【求助】Blob相关

3.8+版本的网络请求,服务器给的是Blob。怎么转为图片。WEB端可以正常转。但是微信小游戏不支持。该怎么适配?

引入一个支持blob的库,比如:

import { Base64 } from "js-base64";
let base64Data = Base64.atob(this.data);

没用库,手转解决了 :joy:
private async arrayBufferToSpriteFrame(buffer: ArrayBuffer): Promise {

    return new Promise((resolve, reject) => {

        const base64 = this.arrayBufferToBase64(buffer);

        const img = new Image();

        img.onload = () => {

            const imageAsset = new ImageAsset();

            imageAsset.reset(img);

            const texture = new Texture2D();

            texture.image = imageAsset;

            const spriteFrame = new SpriteFrame();

            spriteFrame.texture = texture;

            resolve(spriteFrame);

        };

        img.onerror = (err) => reject(err);

        img.src = base64;

    });

}

/**

 * 将 ArrayBuffer 转为 base64 字符串

 */

private arrayBufferToBase64(buffer: ArrayBuffer): string {

    const bytes = new Uint8Array(buffer);

    let binary = '';

    for (let i = 0; i < bytes.length; i++) {

        binary += String.fromCharCode(bytes[i]);

    }

    const base64 = this.btoaCompatible(binary); // 编码为base64

    return 'data:image/png;base64,' + base64; // 拼接成图片数据URI

}

private btoaCompatible(input: string): string {

    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

    let str = input;

    let output = '';

    for (let block = 0, charCode: number, i = 0, map = chars;

        str.charAt(i | 0) || (map = '=', i % 1);

        output += map.charAt(63 & (block >> (8 - (i % 1) * 8)))

    ) {

        charCode = str.charCodeAt(i += 3 / 4);

        if (charCode > 0xff) {

            throw new Error("'btoa' failed: 转码失败");

        }

        block = (block << 8) | charCode;

    }

    return output;

}