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

});

}

}

相关推荐
今天_也很困4 小时前
LeetCode热题100-560. 和为 K 的子数组
java·算法·leetcode
在繁华处4 小时前
线程进阶: 无人机自动防空平台开发教程V2
java·无人机
A懿轩A4 小时前
【Java 基础编程】Java 变量与八大基本数据类型详解:从声明到类型转换,零基础也能看懂
java·开发语言·python
m0_740043734 小时前
【无标题】
java·spring boot·spring·spring cloud·微服务
_乐无4 小时前
Unity加载gly 点云 高斯泼溅渲染
unity
坚定信念,勇往无前5 小时前
unity发布BuildWebGL.wasm 加载过慢
unity·wasm
@ chen5 小时前
Spring事务 核心知识
java·后端·spring
aithinker5 小时前
使用QQ邮箱收发邮件遇到的坑 有些WIFI不支持ipv6
java
星火开发设计5 小时前
C++ 预处理指令:#include、#define 与条件编译
java·开发语言·c++·学习·算法·知识
Hx_Ma165 小时前
SpringMVC返回值
java·开发语言·servlet