小白直接求个代码吧! cocos怎么实现对特定节点截图?试了网上好几个方法都不行。

大佬们,直接扔给我一个能跑起来的代码。

场景就是一个图片
在代码里能拿到他的base64即可。
image

/**
 * @title 将节点内容导出为图片
 * @param {cc.Node} node
 */
captureNode2Base64 (node) {
    // 初始化渲染纹理
    let width = node.width;
    let height = node.height;
    let w_h = width / height;
    let vw_vh = cc.visibleRect.width / cc.visibleRect.height;
    let _texture = new cc.RenderTexture();
    _texture.initWithSize(width, height, cc.gfx.RB_FMT_S8);

    // 获取canvas画布
    let _canvas = document.getElementById('capture_canvas');
    if (!_canvas) {
        _canvas = document.createElement('canvas');
        _canvas.setAttribute('id', 'capture_canvas');
    }
    _canvas.width = width;
    _canvas.height = height;
    let _ctx = _canvas.getContext('2d');

    // 克隆需要渲染的节点
    let _content = cc.instantiate(node);
    _content.parent = cc.Canvas.instance.node;
    _content.position = cc.v3(0, 0, 0);
    _content.scale = w_h > vw_vh ? (cc.visibleRect.width / width) + 0.02 : (cc.visibleRect.height / height) + 0.02;
    let _camera = _content.addComponent(cc.Camera);
    _camera.alignWithScreen = true;
    _camera.clearFlags = 7;
    _camera.targetTexture = _texture;
    _camera.render(_content);

    // 渲染图片到canvas
    let data = _texture.readPixels();
    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);
    }

    // 销毁临时节点
    _content.destroy();
    _texture.destroy();
    return _canvas.toDataURL("image/png");
},
2赞

貌似可以了 我在多测试一下。

如果是视图内容可滚动的话有办法截图吗?

大佬,如果是视图内容可滚动的话有办法截图吗?

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。