我创建了 samples 的工程, 对着里面的 capture screen 来实现, 但是发现了几个问题:
- RenderTexture 的 initWithSize 的第三个参数是什么? 项目是 ts, cc.game._renderContext 是报错的;
- 如果不传第三个参数/或者照着 sample 的传入, cc.game._renderContext.STENCIL_INDEX8 执行之后会报错;
[ERROR] (/Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_opengl_manual.cpp, 1888): glReadPixels((GLint)arg0 , (GLint)arg1 , (GLsizei)arg2 , (GLsizei)arg3 , (GLenum)arg4 , (GLenum)arg5 , (GLvoid*)arg6 ); GL error 0x506: GL_INVALID_FRAMEBUFFER_OPERATION
[ERROR] Failed to invoke JSB_glReadPixels, location: /Applications/CocosCreator.app/Contents/Resources/cocos2d-x/cocos/scripting/js-bindings/manual/jsb_opengl_manual.cpp:1892
JS: [WARN]: Unknown TEXTURE_FMT: 32
JS: save image data success, file: /var/mobile/Containers/Data/Application/3F38FBA7-4698-4ED8-BD79-31D59FD39AD2/Documents/tmp.png
运行环境:
Creator 2.1.0
iOS 12.1 iPhone7
截屏代码:
`
let parent = cc.director.getScene();
let filePath = jsb.fileUtils.getWritablePath() + “tmp.png”;
// init
let texture = new cc.RenderTexture();
texture.initWithSize(
parent.getContentSize().width,
parent.getContentSize().height,
cc.game._renderContext.STENCIL_INDEX8
);
App.getInstance().camera.targetTexture = texture;
// flip y
let data = texture.readPixels();
let width = texture.width;
let height = texture.height;
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;
for (let i = 0; i < rowBytes; i++) {
picData[reStart + i] = data[start + i];
}
}
// copy sprite
let texture2D = new cc.Texture2D();
texture2D.initWithData(picData, 32, width, height);
let spriteFrame = new cc.SpriteFrame();
spriteFrame.setTexture(texture2D);
let node = new cc.Node();
let sprite = node.addComponent(cc.Sprite);
sprite.spriteFrame = spriteFrame;
node.zIndex = cc.macro.MAX_ZINDEX;
node.parent = parent;
node.x = width / 2.0;
node.y = height / 2.0;
// save
let success = jsb.saveImageData(picData, width, height, filePath);
if (success) {
cc.log("save image data success, file: " + filePath);
} else {
cc.error("save image data failed!");
}
node.runAction(cc.sequence(cc.delayTime(0), cc.callFunc(() => node.destroy())));
`