最近看到论坛好几个关于截图的帖子,趁着咸鱼时间,整合了下功能包装成工具类,主要用于“区域性截图、节点截图、渲染纹理转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附着到需要截图的节点上,执行渲染,完毕; 有问题欢迎吐槽
感觉会用到,先Mark一下
给我 /白嫖怪
web端就用不了jsb的保存了吧
嗯,jsb是原生环境才有的对象
mark一下
太棒了 比官方还靠谱
浏览器可行,但是android原生会在以下代码处进入死循环状态,感觉是没有找到方法,
cc.director.root.device.copyFramebufferToBuffer(texture.window.framebuffer, arrayBuffer, [region]);
使用的版本是creator3.3.2,有什么方法可破吗?
战略性mark~~~
啊,不好意思,才注意。。该方法不存在的话可能是device的问题,也可能是这个方法被删了(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();
}
嗯,这个方法本身没问题(生成文件),截图生成的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异常
Mask!
mark 下
mark 正好学习一下
texture.readPixels()这个方法截图是有问题的,之前按照官方例子来就遇到了,需要调整了