CocosCreator native平台截图

//cocosCreator测试版本号:2.3.2,应该2.x以上都支持的
let captureTexture = {}
captureTexture.captureScreenTexture = function () {
    if (!cc.sys.isNative) {
        //TODO web环境也可以截图
        // persistRootJS().showToast("非原生环境暂不支持截图");
        return;
    }
    var wSize = cc.director.getWinSize();
    let node = new cc.Node();
    node.parent = cc.director.getScene();
    cc.log("Blade:截屏:node:" + JSON.stringify(node.getPosition()))
    let camera = node.addComponent(cc.Camera);
    camera.backgroundColor = cc.Color.TRANSPARENT
    camera.clearFlags = cc.Camera.ClearFlags.DEPTH | cc.Camera.ClearFlags.STENCIL | cc.Camera.ClearFlags.COLOR
    // 设置你想要的截图内容的 cullingMask
    camera.cullingMask = 0xffffffff;
    node.x = wSize.width / 2;
    node.y = wSize.height / 2;



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

    // 如果截图内容中不包含 Mask 组件,可以不用传递第三个参数
    texture.initWithSize(wSize.width, wSize.height, gl.STENCIL_INDEX8);
    camera.targetTexture = texture;

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

    // 这样我们就能从 RenderTexture 中获取到数据了
    let picData = this.filpYImage(texture.readPixels(), wSize.width, wSize.height);
    this.saveFile(picData, node);
}
// This is a temporary solution
/**
 * 反转图片
 * @param {*} data 
 * @param {*} width 
 * @param {*} height 
 * @returns 
 */
captureTexture.filpYImage = function (data, width, height) {
    // create the data array
    let picData = new Uint8Array(width * height * 4);
    let rowBytes = width * 4;
    for (let row = 0; row < height; row++) {
        let srow = height - 1 - row;
        let start = srow * width * 4;
        let reStart = row * width * 4;
        // save the piexls data
        for (let i = 0; i < rowBytes; i++) {
            picData[reStart + i] = data[start + i];
        }
    }
    return picData;
}
/**
 * 保存到本地
 * @param {*} picData 
 */
captureTexture.saveFile = function (picData, node) {
    if (CC_JSB) {
        var wSize = cc.director.getWinSize();
        let filePath = jsb.fileUtils.getWritablePath() + 'render_to_sprite_image.png';

        let success = jsb.saveImageData(picData, wSize.width, wSize.height, filePath)
        if (success) {
            cc.log("save image data success, file: " + filePath);
        }
        else {
            cc.error("save image data failed!");
        }
    }
    if (cc.isValid(node)) {
        node.removeFromParent(true);
        node.destroy();
        node = null;
    }
}

window.captureTexture = captureTexture;
module.exports = captureTexture;

以上两种方式要注意的是:

  • EditBox,VideoPlayer,Webview 等控件无法被包含在截图里面,因为这是 OpenGL 的渲染到纹理的功能,上面提到的控件不是由引擎绘制的。
  • 只适用于原生平台
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值