unity截屏上传后台功能

Unity 截屏功能-截图并上传到服务器

在unity中有时候会用到截屏的功能,今天分享一下我东拼西凑实现了的截屏功能

    //先看截屏方法
    首先需要定义一个byte数组用于下边接收截屏读取的图片流
    byte[] bytes;
   Texture2D CaptureCamera(Camera camera, Rect rect)
{
    Debug.Log(Application.dataPath);
    // 创建一个RenderTexture对象  
    RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);

    //先给RenderTexture附上一层后方实景相机渲染的图片
    //ps: --- 如果这样加上第二个相机,可以实现只截图某几个指定的相机一起看到的图像。  
    camera2.targetTexture = rt;
    camera2.Render();
    //ps: -------------------------------------------------------------------  
    //再附上ui相机的画面
    //这里我就加了第二个相机的画面
    // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
    camera.targetTexture = rt;
    camera.Render();


    // 激活这个rt, 并从中中读取像素。  
    RenderTexture.active = rt;
    Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
    screenShot.ReadPixels(rect, 0, 0);// 注:这个时候,它是从RenderTexture.active中读取像素  
    screenShot.Apply();

    // 重置相关参数,以使用camera继续在屏幕上显示  
    camera2.targetTexture = null;
    camera.targetTexture = null;
    //ps: camera2.targetTexture = null;  
    RenderTexture.active = null; // JC: added to avoid errors  
    GameObject.Destroy(rt);
    // 最后将这些纹理数据,成一个png图片文件  
    bytes = screenShot.EncodeToPNG();
    string filename = Application.dataPath + "/Screenshot.png";
    //定义图片保存路径(下边这句中的System.DateTime.Now.ToString("yyyyMMddHHmmssffff"是获取系统时间,年月日时分秒)
    //这句是另外保存的一张图片,项目需求,一般用上边那句就可以了
    string filename1 = "D://bluemountain" + "/Screenshot"+ System.DateTime.Now.ToString("yyyyMMddHHmmssffff")+".png";
    //string filename = "C:/Users/Administrator/Desktop/今日资源" + "/Screenshot.png";
    System.IO.File.WriteAllBytes(filename, bytes);//创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
    System.IO.File.WriteAllBytes(filename1, bytes);//创建一个新文件,在其中写入指定的字节数组,然后关闭该文件。 如果目标文件已存在,则覆盖该文件。
    Debug.Log(string.Format("截屏了一张照片: {0}", filename));
    //到这里为止呢你已经成功截到一张图片啦
    Sprite aa = Sprite.Create(screenShot,new Rect(0,0, screenShot.width, screenShot.height),Vector2.zero);
    Zhengzaishangchuan.SetActive(true);//显示正在上传ui、
    //下边两句是给两个物体picture和picture5的材质赋值,内容为截屏内容
    picture.GetComponent<Image>().sprite = aa;
    picture5.GetComponent<Image>().sprite = aa;
    //上传到后台
    //byte[] bytes = screenShot.EncodeToPNG();
    string url = "地址";//要上传到的地址(自己提供)
    //创建表单
    WWWForm form = new WWWForm();
    //form.AddField("file", filename);//在服务器添加字段
    form.AddBinaryData("file", bytes);//把图片流上传(file是接口字段,这需要你拿到接口文档,唯一的)
    //表单字段 assort 值 2(这需要你拿到接口文档,唯一的)
    form.AddField("assort", 1);
    //上传到服务器  
    //开始上传就进入倒计时 (开关)
    StartCoroutine(PostData(url, form));

    return screenShot;
}

//图片上传协程
IEnumerator PostData(string url, WWWForm form)
{
    WWW www = new WWW(url, form);
    
    yield return www;
    Debug.Log(www.text);//输出服务器返回结果        
    
    //解析Json字符串
    ResultJsonDate result = new ResultJsonDate();
    result = JsonUtility.FromJson<ResultJsonDate>(www.text);       
    if (result.code == "200")
    {
       Debug.Log("上传成功");
        //Panels[3].SetActive(false);//合影界面消失
    //    _createCode._CreatCodePrivate(result.data.file_url);
         //_createCode._CreatCodePrivate("http://m.10010.com/subjectpage/69800000359542.html");
         //Panels[4].SetActive(true);//二维码界面显示
        // SuccessUI.SetActive(true);
        //StartCoroutine(daojishi());
     }
     else
     {
         //重新请求
         Debug.Log("上传失败");
        //显示上传失败ui
    
     }   
    yield return null;
}

//那么如何来调用这个方法呢 这样>_<
CaptureCamera(Camera.main, new Rect(0, 0, Screen.width, Screen.height));//调用截屏方法
//怎么样学会了吗

//我也是小白,如果文中有错误的、不够合理的地方还请大家多多指教。
欢迎交流学习

在这里插入图片描述

posted @ 2022-06-22 18:06  哒哒哒~~~  阅读(278)  评论(0编辑  收藏  举报