通过ArrayBuffer来创建Texture的问题

使用arraybuffer来创建image

        let img = new Image()
        img.onload = () => {
            r(img)
        }
        img.onerror = () => {
            r(null)
        }
        const b64 = crypto.enc.Base64.stringify(crypto.lib.WordArray.create(data))
        img.src = `data:image/*;base64,${b64}`

然后创建texture

                const texture = new Texture2D()
                texture.reset({
                    width: img.naturalWidth,
                    height: img.naturalHeight,
                    format: Texture2D.PixelFormat.RGBA8888,
                    mipmapLevel: 0,
                })
                texture.uploadData(img, 0, 0)
                texture.updateMipmaps()
                texture.updateImage()

但是最终显示出来的内容是花屏的,全都是纯色或者一些渐变色的色块。

但如果先把arraybuffer保存为文件,再loadRemote就是正常的。

另外 :我上面的代码在web平台是完全正常的。

我用 URL.createObjectURL 也试过,问题更严重,在jsb.loadImage的位置好像就彻底卡住了,根本不返回。

可以试试这个

    export function createSpriteFrameByUint8Array(data:{picData:Uint8Array,width:number,height:number}){
        let img = new ImageAsset();
        img.reset({
            _data: data.picData,
            width: data.width,
            height: data.height,
            format: Texture2D.PixelFormat.RGBA8888,
            _compressed: false
        });
    
        let tex = new Texture2D();
        tex.image = img;
    
        let sf = new SpriteFrame();
        sf.texture = tex;
        sf.packable = false;
    
        return sf
    }
2赞

原来这样就行了

const asset = new ImageAsset(img)

const texture = new Texture2D()
texture.image = asset
texture.updateImage()

如果你的ArrayBuffer本身就是个Unit8ArrayBuffer,那直接通过 Texture2D.uploadData进行上传即可,为何还需要多用一个ImageAsset做一次对象的转化