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);

});

}

}

相关推荐
橙露8 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
小程故事多_808 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
冰暮流星8 小时前
sql语言之分组语句group by
java·数据库·sql
望舒5138 小时前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖8 小时前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖8 小时前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
NuageL8 小时前
原始Json字符串转化为Java对象列表/把中文键名变成英文键名
java·spring boot·json
222you9 小时前
Redis的主从复制和哨兵机制
java·开发语言
江湖有缘9 小时前
零基础入门:使用 Docker 快速部署 Organizr 个人主页
java·服务器·docker
chilavert3189 小时前
技术演进中的开发沉思-357:重排序(下)
java·后端