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

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

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

1、js部分:

截图代码:

/**
     * @name: 截屏并保存图片
     * @param {cc.Node} 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部分 :
创建一个SaveImgModule.java文件,放在proj.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 Ryan.Tang
 * 
 */
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(this.node);方法即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Qt Creator是一款集成开发环境,它提供了强大的功能支持,包括代码编辑、调试、图形化界面设计等。其中,书签功能是一项常用的辅助功能,它可以帮助开发者在代码中标记重要的位置,以便快速定位和访问。 然而,有时候我们可能会遇到Qt Creator的书签功能无法保存的情况。造成无法保存书签的原因可能有以下几种: 首先,可能是Qt Creator的配置文件发生了错误或损坏。配置文件中保存了用户的个性化设置和一些软件状态信息,如果该文件出现问题,可能导致无法保存书签。解决办法是尝试重新创建或重置配置文件,并重新启动Qt Creator。 其次,可能是使用的Qt Creator版本存在一些bug或问题。在软件开发中,bug是不可避免的,可能会影响到软件功能的正常运行。解决办法是检查是否有新的软件更新版本,如果有,尝试升级到最新版本来修复可能的问题。 另外,还有可能是用户没有正确操作导致书签无法保存。有时候我们可能会误操作或者不熟悉软件的某些功能,导致一些设置无效。解决办法是仔细查看Qt Creator的使用手册或者搜索相关的问题解答,检查自己是否遗漏了某些步骤或设置。 总的来说,Qt Creator的书签功能无法保存可能是由于配置文件错误、软件版本问题或用户操作错误所致。我们可以尝试重新创建或重置配置文件、升级软件版本以及仔细检查操作步骤来解决该问题。此外,如果问题仍然存在,还可以尝试向Qt Creator的开发者或相关论坛寻求帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值