cocos2.02 Android原生截屏分享

cocos creator2.01 android运行黑屏 继续讨论:

cocos creator cc.RenderTexture截图 保存到本地的方法不可用(saveToFile找不到)? 继续讨论:

3赞

自己先 回复下, cocos2.0 cc.RenderTexture 的函数saveToFile 这么没有了? 那个大神指导 有替代的api么?

1赞

测试工程 example-cases,测试例 render_to_sprite

if (CC_JSB) {
     let data = this.renderTexture.readPixels();
     let width = this.renderTexture.width;
     let height = this.renderTexture.height;
     let filePath = jsb.fileUtils.getWritablePath() + 'render_to_sprite_image.png';
     let success = jsb.saveImageData(data, width, height, filePath);
     if (success) {
         cc.log("save image data success, file: " + filePath);
     }
     else {
         cc.error("save image data failed!");
     }
 }
 else {
     cc.log("saveImage, only supported on native platform.");
 }
1赞

多谢,太给力了 回复速度好快

mark

要仔细看 change log

http://forum.cocos.com/t/rc2-cocos-creator-v2-0-2/65820

FEATURE
原生平台添加 jsb.saveImageData 接口来保存截图,请参考测试用例

嗯 多谢 ,在您的指导下 问题已解决

保存的截图是倒置的,而且png图片,没有透明度·····是我哪用的不对么。测试用例的打开方式不对?

老铁再问下,我这边 Android 截屏 只截到了屏幕的四分之一 还是倒立的,代码如下(麻烦指导下 多谢):
let node = new cc.Node();
node.parent = cc.director.getScene();
node.width = cc.view.getVisibleSize().width;
node.height = cc.view.getVisibleSize().height;
let camera = node.addComponent(cc.Camera);

    // 设置你想要的截图内容的 cullingMask
    camera.cullingMask = 0xffffffff;
    
    // 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样 camera 的内容将会渲染到新建的 RenderTexture 中。
    let texture = new cc.RenderTexture();
    texture.initWithSize(cc.view.getVisibleSize().width, cc.view.getVisibleSize().height);
    camera.targetTexture = texture;

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

    // 这样我们就能从 RenderTexture 中获取到数据了
    let data = texture.readPixels();
    let width = texture.width;
    let height = texture.height;
    let fileName = "result_share.jpg";
    let fullPath = jsb.fileUtils.getWritablePath() + fileName;
    if (jsb.fileUtils.isFileExist(fullPath)) {
        jsb.fileUtils.removeFile(fullPath);
    }
    let success = jsb.saveImageData(data, width, height, fullPath);
    if (success) {
        cc.log("twl 截屏成功-->",fullPath,width,height);
        if (callBack) {
            callBack(fullPath);
        }
    }
    else {
        cc.error("save image data failed!");
    }

兄弟 你怎么解决的呢 截图会倒过来。。而且游戏界面会闪屏。。

readPixels 获取到的 ImageData 是倒置的,saveImageData 只做了保存成图片的工作。可以手动颠倒 pixels(这个地方是有一点反直觉,panda 大大说,后续会更改获取 texture 的方式,直接拿到正的)

可能是 bug,你可以看下 js_saveImageData 这里的代码,看能否解决

不太了解,邀请 creator 同事看一下 @crazypad

技术性mark一下,以后肯定用的到。

哦 多谢,这个四分之一的问题 我将node的坐标 设置成 右上角,可以截到全屏了

好像 texture.setFlipY(true);好像没有用 Android端 拿到的图片总是是倒立的, 我这边暂时 在android端bitmap进行了旋转,你这边解决了 麻烦贴下代码 给参考下

1.9.3能用的截图和热更
2.0.2都不好使
所以一旦用上的话 还是老老实实用1.9.3吧 新版都在作 有unity3D还要cocos3D?稳定都做不到。。

还是 有两个问题希望官方技术 指点下:
1、截图生成的图片文件 对弹框半透明部分 无法显示
2、整个截图文件 是镜像翻转的,不知道什么用意

镜像翻转的问题,目前属于历史遗留的 issue 了,暂时不好修复,规避的方案建议可以参考 render_to_canvas 按行获取 piexls 。

这个问题我的锅,保存 png 的默认行为是不保存 alpha 信息的,改一下默认值就好,参考:

https://github.com/cocos-creator/cocos2d-x-lite/pull/1554 @valiancer

mark

https://github.com/cocos-creator/example-cases/pull/616
@605127724 @valiancer
目前官方案例已更新倒置截屏问题,暂做临时解决方案