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

});

}

}

相关推荐
霸道流氓气质9 分钟前
Spring AI Alibaba Skills 完整实战:从零构建智能会议助手
java·人工智能·spring
极客先躯20 分钟前
高级java每日一道面试题-2026年02月04日-实战篇[Docker]-如何在容器之间共享数据?
java·运维·网络·docker·容器·自动化·高级面试题
真实的菜20 分钟前
微服务架构痛点
java·微服务·架构
小楊不秃头22 分钟前
Spring:Bean的存储
java·spring·bean
西凉的悲伤22 分钟前
多线程彻底掌握 CompletableFuture:从入门到项目实战
java·多线程·future·completable·异步
用户2986985301422 分钟前
Java 中的 HTML 解析:从文件读取、URL 抓取到数据提取
java·后端
plainGeekDev22 分钟前
ContentProvider → Room + Repository
android·java·kotlin
plainGeekDev28 分钟前
SQLite 手动升级 → Room Migration
android·java·kotlin
带刺的坐椅31 分钟前
SolonCode(编码智能体)支持鸿蒙 PC
java·web·ai编程·harmonyos·soloncode·鸿蒙 pc
程序员二叉31 分钟前
【JVM】类加载全过程&双亲委派机制深度解析
java·jvm·面试