Cocos Creator截图

时间:2025-03-31 11:59:31

在 中,我们一般通过 来完成截图功能,但是这是属于旧版本渲染树中的一个功能,在Cocos Creator2.0去除渲染树后,截图功能的使用方式也完全不同了。简单来说,2.0 中 变成了一个资源类型,继承自贴图()资源。我们通过将某个摄像机内容渲染到 资源上完成截图,具体的使用方式参考Cocos Creator文档中 Camera 文档截图章节。

摄像机可能是 到 2.0 改动最大的一个组件,为了可以顺畅更新,Creator 尽量保持了组件层 API 的一致性,然而 Camera 的使用方式和 API 却无法做到简单迁移。因为在 2.0 中,Camera 从一个配角变成了主角。

Cocos Creator2.0截图

官方文档里给出了浏览器的截图方法,但是没有提供保存图片的方法,所以原生平台目前大概还不能用

let node = new ();
 = ();
let camera = ();

// 设置你想要的截图内容的 cullingMask
 = 0xffffffff;

// 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样 camera 的内容将会渲染到新建的 RenderTexture 中。
let texture = new ();
(, );
 = texture;

// 渲染一次摄像机,即更新一次内容到 RenderTexture 中
();

// 这样我们就能从 RenderTexture 中获取到数据了
let data = ();

// 接下来就可以对这些数据进行操作了
let canvas = ('canvas');
let ctx = ('2d');
 = ;
 = ;

let rowBytes = width * 4;
for (let row = 0; row < height; row++) {
    let srow = height - 1 - row;
    let imageData = (width, 1);
    let start = srow*width*4;
    for (let i = 0; i < rowBytes; i++) {
        [i] = data[start+i];
    }

    (imageData, 0, row);
}

let dataURL = ("image/jpeg");
let img = ("img");
 = dataURL;

Cocos 截图

遇到的问题

首先如果截取的是整个Canvas的话,官方文档也没有详细的说明,直接使用 就可以截图

但是如果截取的是单个node,则显示会有问题

Q&A:

1.如果只截取到部分图片?
需要将截取的节点的父节点的锚点设置为(0,0)
2.截取图片后,整个node会移动到左下?
可以先将该node隐藏,然后再显示出截取的图片替代该node
3.如何截取有mask的节点?
创建时,需要增加两个参数: (640,960, cc.Texture2D.PIXEL_FORMAT_RGBA8888, gl.DEPTH24_STENCIL8_OES);

截图核心代码:

let cocos = ('cocos2', this.node);
    // 创建 renderTexture
let renderTexture = (
    ,
    ,
    cc.Texture2D.PIXEL_FORMAT_RGBA8888,
    gl.DEPTH24_STENCIL8_OES
);

();
cocos._sgNode.visit();
();
// 保存截图文件
("", cc.IMAGE_FORMAT_PNG, true, function () { });

// 获取图片保存地址
()

Demo

/wf96390/CocosScreenShotDemo