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

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

Cocos Creator1.x 截图
遇到的问题
首先如果截取的是整个Canvas的话,官方文档也没有详细的说明,直接使用 cc.RenderTexture 就可以截图

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

Q&A:

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

截图核心代码:

let cocos = cc.find('cocos2', this.node);// 创建 renderTexture
let renderTexture = cc.RenderTexture.create(cocos.width,cocos.height,cc.Texture2D.PIXEL_FORMAT_RGBA8888,gl.DEPTH24_STENCIL8_OES
);renderTexture.begin();
cocos._sgNode.visit();
renderTexture.end();
// 保存截图文件
renderTexture.saveToFile("shot.png", cc.IMAGE_FORMAT_PNG, true, function () { });// 获取图片保存地址
jsb.fileUtils.getWritablePath()

Cocos Creator2.0截图

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

let node = new cc.Node();
node.parent = cc.director.getScene();
let camera = node.addComponent(cc.Camera);// 设置你想要的截图内容的 cullingMask
camera.cullingMask = 0xffffffff;// 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样 camera 的内容将会渲染到新建的 RenderTexture 中。
let texture = new cc.RenderTexture();
texture.initWithSize(cc.visibleRect.width, cc.visibleRect.height);
camera.targetTexture = texture;// 渲染一次摄像机,即更新一次内容到 RenderTexture 中
camera.render();// 这样我们就能从 RenderTexture 中获取到数据了
let data = texture.readPixels();// 接下来就可以对这些数据进行操作了
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
canvas.width = texture.width;
canvas.height = texture.height;let rowBytes = width * 4;
for (let row = 0; row < height; row++) {let srow = height - 1 - row;let imageData = ctx.createImageData(width, 1);let start = srow*width*4;for (let i = 0; i < rowBytes; i++) {imageData.data[i] = data[start+i];}ctx.putImageData(imageData, 0, row);
}let dataURL = canvas.toDataURL("image/jpeg");
let img = document.createElement("img");
img.src = dataURL;

Demo

https://github.com/wf96390/CocosScreenShotDemo

Cocos Creator截屏方法相关推荐

  1. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  2. Android截屏方法总结

    最近研究了一些Android的截屏方法,做一个总结. 图片剪裁方法 使用View.getDrawingCache()得到Bitmap.非常简单但是只能截图本应用的图片,并且没办法控制截图的范围. 对B ...

  3. 福步怎么自定义头像_苹果手机怎么截屏 苹果手机截屏方法有几种?原来还可以这么操作...

    虽然iOS系统的确比安卓系统流畅,但是一些比较常用的使用功能没有安卓手机多.简单的截屏操作起来都麻烦得不行. 很多人都认为苹果手机的截屏,只能按电源键截屏,还不能截长屏.那是因为你对苹果手机的设置不够 ...

  4. 截屏没有了_原来华为手机的截屏方法不止3种,用了这么久,现在才知道新玩法?...

    华为手机有很多种截屏的方法,这些花式截屏方法,能够让不少华为用户玩上一整天,可是小酱却发现,华为手机的截屏方法不止3种,用了这么久,总算让小酱找到截屏的新玩法了. 下面就让小酱来跟大家一起说说,华为手 ...

  5. 截屏当前界面_华为手机居然有这3种神奇的截屏方法,用过后,我就再也离不开了...

    手机上看到有用的东西,我们通常都会把它截屏下来,分享到微信朋友圈,或者存放在我们手机内存里以备后用.所有的品牌手机,基本上都提供了"手机按键截屏"和"通知栏里的截屏按钮& ...

  6. 电脑知识:分享几款常用的截屏方法,欢迎收藏!

    今天小编给大家介绍几个常用截屏的方法,希望对大家的日常办公能有所帮助! 1.Windows系统自带截图工具 点击左下角开始菜单在"所有程序"里找到"附件",里面 ...

  7. oppo 手机侧滑快捷菜单_oppo手机如何截图 oppo手机快捷键截屏方法【教程】

    oppo手机怎么截图的,oppo手机如何快捷键截屏方法介绍:随着越来越多人使用oppo手机,oppo手机的许多性能也被开发出来了,光是截图方法就有四种之多,这里就给大家带来四种截图方法介绍. oppo ...

  8. 苹果xr怎么截屏_苹果怎么截图?教你各种iPhone机型截屏方法

    苹果手机怎么截图?刚刚换手机的用户往往会遇到一个难题:新手机怎么截屏?很多手机上都有自带的截图功能,但是刚换手机的小伙伴可能找不到截图的方法,为了帮助大家更熟悉自己的新手机,今天帮大家整理了各种型号i ...

  9. 苹果xr如何截屏_iphone敲两下截屏如何操作 苹果手机触控截屏方法【教程步骤】...

    iphone敲两下截屏如何操作?相信小伙伴们一定很好奇,下面小编为大家带来了苹果手机触控截屏方法教程详解,感兴趣的小伙伴赶紧跟着小编一起来看看吧 iphone敲两下截屏怎么设置 轻点两下进行截屏其实是 ...

最新文章

  1. 多地通知!防止疫情反扑将控制教职工和学生外出,新一轮校园封闭要开始了?...
  2. mxnet统计运算量
  3. 服务器连接kvm不显示,kvm切换器使用中易出现问题及简单解决方式
  4. 5 网络层----IP协议相关技术
  5. 微软推出 Pylance,改善 VS Code 中的 Python 体验
  6. 协议类接口 - NAND
  7. 我在阿里云做前端代码智能化
  8. loadrunner java_如何使用LoadRunner开发JAVA Vuser
  9. android 代码水印,Android实现为图片添加水印
  10. drools动态配置规则_微服务实战系列(八)-网关springcloud gateway自定义规则
  11. Spring中的BeanDefinition
  12. 【转载】C++引用详解
  13. 斯蒂文斯理工学院计算机科学硕士,斯蒂文斯理工学院计算机科学硕士专业
  14. iOS-Runtime之SEL、IMP、Method
  15. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学研究生计算机科学排名关键消息重点总结...
  16. 构建MRCP服务器,使得FreeSWITCH基于mod_unimrcp与科大讯飞进行tts和asr通信
  17. jmeter的${__time(,)}和${__timeShift(,,,,)}函数使用
  18. 【微信】微信,是一个生活方式
  19. LTE与VOLTE基础知识(1)
  20. 办公用计算机安全使用常识,办公电脑使用注意事项

热门文章

  1. 二、T100应付管理之采购应付-预付款立账篇
  2. [百度官方]惊雷算法3.0即将上线 持续打击刷点击
  3. 找别人做网站需要花费上万吗?
  4. 快手如何玩转复杂场景下的说话人识别?| ASRU 2021
  5. 唐纳德布伦信息与计算机科学学院,Learning Parameters Donald Bren School of Informationand 学习参数唐纳德布伦信息学院.ppt...
  6. ChatGpt 能成为恋爱大师吗?
  7. conda安装一直在Solving environment
  8. 数据治理的 “独孤九剑”
  9. python traceback对象_Traceback具体使用方法
  10. 对学校的希望和寄语_学校寄语大全