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

Logo

这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!

更多推荐