//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 的渲染到纹理的功能,上面提到的控件不是由引擎绘制的。
- 只适用于原生平台