creator截屏保存到手机相册功能

时间:2025-03-31 11:58:14

creator截屏保存到手机相册功能

流程:点击按钮——截屏——保存图片到相册

1、js部分:

截图代码:

/**
     * @name: 截屏并保存图片
     * @param {} parentNode: 当前节点
     */    
 saveScreen (parentNode) {
        let node = new cc.Node();
        node.parent = parentNode;
        let cam = node.addComponent(cc.Camera);
        // 设置你想要的截图内容的 cullingMask
        cam.cullingMask = 0xffffffff;
    
        // 新建一个 RenderTexture,并且设置 camera 的 targetTexture 为新建的 RenderTexture,这样camera的内容将会渲染到新建的 RenderTexture 中。
        let texture = new cc.RenderTexture();
        this.texture = texture ;
        let gl = cc.game._renderContext;
    
        // 如果截图内容中不包含 Mask 组件,可以不用传递第三个参数
        texture.initWithSize(cc.visibleRect.width, cc.visibleRect.height, gl.STENCIL_INDEX8);
        cam.targetTexture = texture;

        // 渲染一次摄像机,即更新一次内容到 RenderTexture 中
        cam.render();

        // 这样我们就能从 RenderTexture 中获取到数据了
        let data = texture.readPixels();

        let w = texture.width;
        let h = texture.height;
        let fileName = 'render_to_sprite_image.png';

        if (CC_JSB) {  //原生平台
            //翻转图片
            let picData = new Uint8Array(w * h * 4);
            let rowBytes = w * 4;
            for (let row = 0; row < h; row++) {
                let srow = h - 1 - row;
                let start = srow * w * 4;
                let reStart = row * w * 4;
                // save the piexls data
                for (let i = 0; i < rowBytes; i++) {
                    picData[reStart + i] = data[start + i];
                }
            }    

            let path = jsb.fileUtils.getWritablePath() +  fileName;
            let success = jsb.saveImageData(picData, w, h, path)
            if (success) {
                let args = {};
                args["path"] = path;
                args["filename"] = fileName;
                let json = JSON.stringify(args);
                let fun = function(str){
                    if(str){
                        let actCallback = function(){
                            GameCache.hall.appendTip("截图已保存到相册");
                        }
                        this.captureAction(picData, w, h, actCallback)
                    }
                };

                if(cc.sys.os == cc.sys.OS_ANDROID){
                    return jsb.reflection.callStaticMethod("com/rx/market/core/SaveImgModule", 
                    "requestChannel", 
                    "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", 
                    json, fun);
                }
                else if(cc.sys.os == cc.sys.OS_IOS){
                    //暂时只做了android的
                }
            }
            else{
                //提示截图失败
            }
        }
        else{
            if (!this._canvas) {
                this._canvas = document.createElement('canvas');
                this._canvas.width = w;
                this._canvas.height = h;
            }
            let ctx = this._canvas.getContext('2d');
            cam.render();
            let picData = texture.readPixels();
            // write the render data
            let rowBytes = w * 4; 
            for (let row = 0; row < h; row++) {
                let srow = h - 1 - row;
                let imageData = ctx.createImageData(w, 1);
                let start = srow * w * 4;
                for (let i = 0; i < rowBytes; i++) {
                    imageData.data[i] = picData[start + i];
                }
     
                ctx.putImageData(imageData, 0, row);
            }

            //保存图片
            let dataImg = this._canvas.toDataURL("image/png");
            let save_link = document.createElement('a');
            save_link.href = dataImg;
            save_link.download = fileName;
    
            let event = document.createEvent('MouseEvents');
            event.initEvent("click", true, false);
            save_link.dispatchEvent(event);
            GameCache.hall.appendTip("截图已保存");
        }
    },

截屏动画代码:

/**
 * @name:  播一个截屏动画
 * @param {Array} picData:Uint8Array图像数据
 * @param {Number} width: 宽
 * @param {Number} height: 高
 * @param {Function} actCallback: 回调
 */
captureAction(picData, width, height, actCallback) {
    let texture = new cc.Texture2D();
    texture.initWithData(picData, cc.Texture2D.RGBA8888, width, height);
    let spriteFrame = new cc.SpriteFrame();
    spriteFrame.setTexture(texture);
    let tempNode = new cc.Node();
    let sprite = tempNode.addComponent(cc.Sprite);
    sprite.spriteFrame = spriteFrame;
    tempNode.zIndex = cc.macro.MAX_ZINDEX;
    tempNode.parent = cc.director.getScene();
    tempNode.x = cc.winSize.width / 2;
    tempNode.y = cc.winSize.height / 2;
    let scaleAction = cc.scaleTo(0.5, 0.2);
    let targetPos = cc.v2(tempNode.width*0.2/2 + 20, tempNode.height*0.2/2 + 20);
    let moveAction = cc.moveTo(0.5, targetPos);
    let spawn = cc.spawn(scaleAction, moveAction);
    let finished = cc.callFunc(() => {
        tempNode.destroy();
        if(actCallback){
            actCallback();
        }
    })
    let action = cc.sequence(spawn, cc.delayTime(0.3), finished);
    tempNode.runAction(action);
},

2、android部分 :
创建一个文件,放在-studio\src\com\rx\market\core
目录下
代码如下:

package com.rx.market.core;

import android.content.Intent;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;

import com.rx.market.base.Method;
import com.rx.market.base.Module;
import com.rx.market.export.ChannelExport;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.FileNotFoundException;

/**
 * Tools for handler picture
 * 
 * @author 
 * 
 */
public final class SaveImgModule extends Module {

	private static SaveImgModule _saveImgModule = null;

	public static SaveImgModule getInstance() {
		if (_saveImgModule == null) {
			synchronized (SaveImgModule.class) {
				if (_saveImgModule == null) {
					_saveImgModule = new SaveImgModule();
				}
			}
		}
		return _saveImgModule;
	}

	public SaveImgModule() {
		super("saveImgModule");
		Register("saveImgToSystemGallery",new saveImgToSystemGallery());
	}

	public class saveImgToSystemGallery implements Method {
		//保存图片到系统相册
		@Override
		public String Execute(String args, String callBack) {
			String bRes = "save fail!!!";
			JSONObject json;
			// 文件插入系统图库
			try
			{
				json = new JSONObject(args);
				String path = json.getString("path");
				String filename = json.getString("filename");
				MediaStore.Images.Media.insertImage(activity.getContentResolver(), path, filename, null);
				// 最后通知图库更新
				activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));
				bRes = "save success!!!";
				if(callBack != "") {
					ChannelExport.getInstance().executeAyncMethod(callBack, "save success");
				}
			}
			catch (FileNotFoundException | JSONException e)
			{
				e.printStackTrace();
			}
			return bRes;
		}
	}
}

最后加一个按钮,点击调用saveScreen();方法即可。