Cocos2.X和3.X的截图功能

最近看到论坛好几个关于截图的帖子,趁着咸鱼时间,整合了下功能包装成工具类,主要用于“区域性截图、节点截图、渲染纹理转URL(Base64)”2.X跟官方的无异,只不过简写了挺多,而3.X是基于2.X完善变动的功能;由于3.X目前还没用过,所以对于性能的影响不是很确定。
这里我用的是2.4和3.3测试,3.X变化太大,建议越新越好,不废话,直接发代码(由于这里贴代码不好看,就直接放链接了)
[2.X CaptureUtils](文档:Creator2.X 截屏+节点截图.note 链接:http://note.youdao.com/noteshare?id=d4340ec59e99f71dc274167b28c3756d&sub=2C771F637ACA42C98103F9F0AE17F478)
[3.X CaptureUtils](文档:Creator3.X 截屏+节点截图.note 链接:http://note.youdao.com/noteshare?id=6e341c297dec36391775de676ceaaa04&sub=8193BDD43CE8403BA5B602AE878BD341)
设计原理:创建Camera,绑定渲染纹理,并将Camera附着到需要截图的节点上,执行渲染,完毕; 有问题欢迎吐槽:grinning:

15赞

感觉会用到,先Mark一下

给我 /白嫖怪 :11:

web端就用不了jsb的保存了吧

嗯,jsb是原生环境才有的对象

mark一下

太棒了 比官方还靠谱

浏览器可行,但是android原生会在以下代码处进入死循环状态,感觉是没有找到方法,
cc.director.root.device.copyFramebufferToBuffer(texture.window.framebuffer, arrayBuffer, [region]);

使用的版本是creator3.3.2,有什么方法可破吗?

战略性mark~~~

啊,不好意思,才注意。。该方法不存在的话可能是device的问题,也可能是这个方法被删了:grinning:(3.4版本确实删了这个方法)
3.X改进版已更新,读取像素信息大概如下(cc.RenderTexture.prototype.readPixels在3.4又加回来了):

/**
* 读取渲染纹理像素信息
* @param texture
*/
public static readPixels(texture: cc.RenderTexture): Uint8Array {
// 通用版本
var { width, height } = texture, gfxTexture = texture.getGFXTexture(), gfxDevice = texture’_getGFXDevice’, bufferViews = [],
region = new cc.gfx.BufferTextureCopy, buffer = new Uint8Array(width * height * 4);
// region.texOffset.x = region.texOffset.y = 0;
region.texExtent.width = width;
region.texExtent.height = height;
bufferViews.push(buffer);
gfxDevice && gfxDevice.copyTextureToBuffers(gfxTexture, bufferViews, [region]);
return buffer;
// 3.4及以上版本
// return texture.readPixels();
}

jsb.fileUtils.writeDataToFile(data, filePath); 这个方法,存进Android后,打开这张图片什么都没有哦,这里确定没有问题吗?

嗯,这个方法本身没问题(生成文件),截图生成的RGBA像素信息也没问题(拷贝到web上是能正常显示的),那唯一有问题的就是RGBA数据不适合这个方法,试过使用fileUtils获取内部的图片返回的数据是ArrayBuffer,且不为widthheight4这样的长度,说明这中间两种数据格式需要经过一层转化(官方说3.5后支持);
这里有个官方的帖子有现有的处理方式 CococsCreator 3.x 技术方案分享

好东西,另外提示一下,3.x的截图,如果用到翻转函数filpYImage,一定要保证图片width和height是整数,view.getVisibleSize()会提供小数点精度的数据,注意防坑

正好需要,感谢大佬分享。

mark~~截图总结

你们3.x截图在win模拟器上会显示纯黑色么,,,我在web和android都是正常的,就win异常