3.0版本 renderTexture 截图后如何保存

截取3dcamera的绘制内容到rendertexture后,怎么把图片转换成base64的字符串或者保存在本地呢?以前的SaveToFile 没有了。文档里面也没有写如何保存。。哪位大大知道吗?

1赞

官方大大可以给个提示吗?谢谢

同求!!!!!

C3D关于用RenderTexture截屏 根据这个地方的回复整理测试了一下。思路通了。但是效果还是有点问题

onCapture()

{

    let renderTex = new RenderTexture();

    renderTex.initialize({

        width: Math.floor(view.getVisibleSize().width),

        height: Math.floor(view.getVisibleSize().height),

    });

    this.sceneCamrea.targetTexture  = renderTex;

    //方式1 肉眼可见黑屏一下

    this.scheduleOnce(()=>{

        let data = this.copyRenderTex(renderTex);

        this.sceneCamrea.targetTexture = null;

     });

    //方式2 截图出来的图是乱的

    // director.root?.pipeline.render([this.sceneCamrea.camera]);

    // let data = this.copyRenderTex(renderTex);

    // this.sceneCamrea.targetTexture = null;

}

copyRenderTex(renderTex:RenderTexture)

{

    let arrayBuffer = new ArrayBuffer(renderTex.width*renderTex.height*4);

    let region = new GFXBufferTextureCopy();

    region.texOffset.x = 0;

    region.texOffset.y = 0;

    region.texExtent.width = renderTex.width;

    region.texExtent.height = renderTex.height;

    let frambuffer = renderTex.window?.framebuffer!;

    director.root?.device.copyFramebufferToBuffer(frambuffer, arrayBuffer, [region]);

    this.toB64(arrayBuffer);

}

toB64(arrayBuffer: ArrayBuffer): string {

    let canvas = document.createElement('canvas');

    let winSize = view.getVisibleSize();

    let width = canvas.width = Math.floor(winSize.width);

    let height = canvas.height = Math.floor(winSize.height);

    let ctx = canvas.getContext('2d')!;

    let imageU8Data = new Uint8Array(arrayBuffer);

    let rowBytes = width * 4;

    let rowBytesh = height * 4;

    for (let row = 0; row < rowBytesh; row++) {

        let sRow = row;

        let imageData = ctx.createImageData(width, 1);

        let start = sRow * rowBytes;

        for (let i = 0; i < rowBytes; i++) {

            imageData.data[i] = imageU8Data[start + i];

        }

        ctx.putImageData(imageData, 0, row);

    }

    var base64 = canvas.toDataURL("image/jpeg", 0.1); //压缩语句

    return base64;

}
1赞

可以一起研究一下那个黑屏或者截图混乱怎么解决。。。 :smile:

director.root?.pipeline.render 使用地形会花屏,所以最终只能使用 scheduleOnce的方式,新建1个相机用来截图,就不会存在黑屏的情况,就满足了当前需求

1赞
    let texture = new RenderTexture();
    texture.reset(view.getVisibleSize());
    this.Camera_Main.targetTexture = texture;
    let newSpFrame = new SpriteFrame();
    newSpFrame.texture = texture;
    this.png.spriteFrame = newSpFrame;

哥,我用的是这个,截全屏的,不过到现在3.0的截图保存到本地还是没有思路,官方的保存方案2.x版本rendertexture的一个方法和jsb的一个方法3.0没找到 :sob:

aaa 这俩0.0

有base64的话可以写原生代码去保存。。3.0的jsb.saveimagetofile貌似没有了

保存为文件可以试试原生代码。。fileutils 有个 writeToFile 可以研究一下。。

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。