unity 处理图片:截图,下载,保存

1.场景上加入图片处理代码类

using System;

using System.Collections;

using System.IO;

using UnityEngine;

using UnityEngine.Networking;

namespace MyPictrue

{

/// <summary>

/// 处理图片:截图,下载,保存

/// </summary>

public class ProcessImages : MonoBehaviour

{

private static ProcessImages _instance;

private static ProcessImages Instance

{

get

{

if (_instance == null)

{

GameObject obj = new GameObject("ProcessImages");

_instance = obj.AddComponent<ProcessImages>();

DontDestroyOnLoad(obj);

}

return _instance;

}

}

/// <summary>

/// 截图

/// </summary>

/// <returns></returns>

public static void ScreenshotPictrue(GetPicture callBack)

{

Instance.StartCoroutine(Instance.waitTimeGetPicture(callBack));

}

protected IEnumerator waitTimeGetPicture(GetPicture callBack)

{

yield return new WaitForEndOfFrame();

//截图

Texture2D pictrue;

var rect = new Rect(0, 0, Screen.width, Screen.height);

pictrue = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);

pictrue.ReadPixels(rect, 0, 0);

pictrue.Apply();

callBack?.Invoke(pictrue);

}

/// <summary>

/// 下载图片

/// </summary>

/// <param name="url"></param>

/// <param name="onload"></param>

/// <param name="onError"></param>

public static void LoadImage(string url, LoadImageTexture onload, LoadImageError onError)

{

Instance.StartCoroutine(Instance.Load(url, onload, onError));

}

protected IEnumerator Load(string url, LoadImageTexture onload, LoadImageError onError)

{

//加载图片

using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))

{

yield return www.SendWebRequest();

if (www.result != UnityWebRequest.Result.ConnectionError)

{

Texture2D tx = DownloadHandlerTexture.GetContent(www);

onload?.Invoke(tx);

}

else

{

onError?.Invoke(www.result);

}

}

}

/// <summary>

/// texture2D压缩到指定宽高

/// </summary>

/// <param name="source">原图</param>

/// <param name="targetWidth"></param>

/// <param name="targetHeight"></param>

/// <returns></returns>

public static Texture2D ScaleTexture(Texture2D source, int targetWidth, int targetHeight)

{

RenderTexture rt = RenderTexture.GetTemporary(targetWidth, targetHeight);

RenderTexture.active = rt;

Graphics.Blit(source, rt);

Texture2D resizedTexture = new Texture2D(targetWidth, targetHeight);

resizedTexture.ReadPixels(new Rect(0, 0, targetWidth, targetHeight), 0, 0);

resizedTexture.Apply();

RenderTexture.active = null;

RenderTexture.ReleaseTemporary(rt);

return resizedTexture;

}

/// <summary>

/// texture2D转字符Base64

/// </summary>

/// <param name="texture2D"></param>

/// <returns></returns>

public static string Texture2DToBase64(Texture2D texture2D)

{

byte\[\] imageData = texture2D.EncodeToJPG();

string baser64 = Convert.ToBase64String(imageData);

return baser64;

}

/// <summary>

/// texture2D保存成JPG

/// </summary>

/// <param name="texture2D"></param>

/// <param name="url">保存地址</param>

public static void SaveJPG(Texture2D texture2D, string url)

{

string names = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";

byte\[\] imageData = texture2D.EncodeToJPG();

File.WriteAllBytes(url, imageData);

Debug.Log("保存照片:" + names);

}

/// <summary>

/// texture2D保存成JPG

/// </summary>

/// <param name="texture2D"></param>

/// <param name="url"></param>

public static void SavePNG(Texture2D texture2D, string url)

{

string names = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";

byte\[\] imageData = texture2D.EncodeToPNG();

File.WriteAllBytes(url, imageData);

Debug.Log("保存照片:" + names);

}

}

/// <summary>

/// 下载图片委托

/// </summary>

/// <param name="texture2D"></param>

public delegate void LoadImageTexture(Texture2D texture2D);

/// <summary>

/// 截图委托

/// </summary>

/// <param name="texture2D"></param>

public delegate void GetPicture(Texture2D texture2D);

/// <summary>

/// 下载图片错误委托

/// </summary>

/// <param name="error"></param>

public delegate void LoadImageError(UnityWebRequest.Result error);

}

2.调用方法

using MyPictrue;

using UnityEngine;

using UnityEngine.UI;

public class TestPictrue : MonoBehaviour

{

public RawImage raw;

public string URL = "";

// Start is called before the first frame update

void Start()

{

//截图

ProcessImages.ScreenshotPictrue((texture2D) =>

{

raw.texture = texture2D;

});

//下载

ProcessImages.LoadImage(URL, load =>

{

raw.texture = load;

}, error =>

{

Debug.Log(error);

});

}

}

相关推荐
M-Robots echo6 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~6 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
mldong7 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
mqiqe8 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一518 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding8 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g9 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
AC赳赳老秦9 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
小强库计算机毕业设计11 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
李冰然11 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java