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));//调用截屏方法
//怎么样学会了吗
//我也是小白,如果文中有错误的、不够合理的地方还请大家多多指教。
欢迎交流学习