unity 截屏并转化为base64并显示截图

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Manager_fan : MonoBehaviour
{
    public static Manager_fan instance;
    public Button button_target;
    public Button button_close;
    public Button button_capture;
    public Button button_clear_txt;
    public Button button_clear_images;
    public Button button_sub;
    public Transform target;
    [Header("文本")]
    public GameObject prefabs;
    [Header("图片item")]
    public GameObject prefabs_image;
    public Transform txt_parent;
    public Transform capture_parent;

    public GameObject[] gameObjects;
    private Dictionary<string, GameObject> dic_obj = new Dictionary<string, GameObject>();

    private bool stop;
    //content\base64
    private Texture2D sprite,sprite1;
    private List<text_demo> text_Demos = new List<text_demo>();
    private bool stop1;
    public bool Stop1 { get => stop1; set => stop1 = value; }

    public class text_demo
    {
        public Vector3 hit_v3;
        public GameObject prefabs_item;
    }
    private void Awake()
    {
        instance = this;
        for (int i = 0; i < gameObjects.Length; i++)
        {
            dic_obj.Add(gameObjects[i].name, gameObjects[i]);
        }
        sprite = Resources.Load<Texture2D>("target");
        sprite1 = Resources.Load<Texture2D>("close");
    }
    void Addlister_arr()
    {
        button_target.onClick.AddListener(delegate ()
        {
            if (stop == false)
            {
                Cursor.SetCursor(sprite, new Vector2(338, 338), CursorMode.Auto);
                Stop1 = false;
            }
            else
            {
                Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
            }
            stop = !stop;
        });

        button_close.onClick.AddListener(delegate ()
        {
            if (Stop1 == false)
            {
                Cursor.SetCursor(sprite1, new Vector2(16, 16), CursorMode.Auto);
                stop = false;
            }
            else
            {
                Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
            }
            Stop1 = !Stop1;

        });
        button_capture.onClick.AddListener(delegate ()
        {
            dic_obj["相机区域"].SetActive(true);

        });
    }

    // Start is called before the first frame update
    void Start()
    {

        Addlister_arr();
    }

    // Update is called once per frame
    void Update()
    {
        Model_ray();
    }
    void Model_ray()
    {
        if (stop == true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit, Mathf.Infinity))
                {
                    if (hit.transform == target)
                    {
                        GameObject gameObject = Instantiate(prefabs, txt_parent);
                        text_demo text_Demo = new text_demo();
                        text_Demo.hit_v3 = hit.point;
                        text_Demo.prefabs_item = gameObject;

                        text_Demos.Add(text_Demo);
                    }
                }
            }
        }
    }
   
    private void LateUpdate()
    {
        if (text_Demos.Count != 0)
        {
            for (int i = 0; i < text_Demos.Count; i++)
            {
                text_Demos[i].prefabs_item.transform.position = Camera.main.WorldToScreenPoint(text_Demos[i].hit_v3);
            }
        }
    }
    /// <summary>
    /// 删除UI
    /// </summary>
    /// <param name="obj"></param>
    public void Delete_from_obj(GameObject obj)
    {
        for (int i = 0; i < text_Demos.Count; i++)
        {
            if(text_Demos[i].prefabs_item== obj)
            {
                text_Demos.Remove(text_Demos[i]);
                Destroy(obj);
            }
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public delegate void CallBack();
public class ScreenShotTest : MonoBehaviour
{
    public Camera renderCamera;
    public GameObject ui_bg;
    public Canvas scaler;

    //************
    [Header("根据当前ui大小截屏")]
    public Transform camera_picture;
    //画布界限
    private float X_left, Y_up, X_right, Y_down;
 
    public Image image_show;
    [Header("相机but")]
    public Button but_capture;
    
    
    private void Awake()
    {
       
        but_capture.onClick.AddListener(delegate ()
        {
            ui_bg.SetActive(false);
            Reset_image_rect();
            StartCoroutine(ScreenCapture(new Rect(X_left, Y_down, X_right - X_left, Y_up - Y_down), "", Callback));
        });

    }
    public void Base64ToImg(Image imgComponent, string base64)
    {
        byte[] bytes = Convert.FromBase64String(base64);
        Texture2D tex2D = new Texture2D(45, 55);
        tex2D.LoadImage(bytes);
        Sprite s = Sprite.Create(tex2D, new Rect(0, 0, tex2D.width, tex2D.height), new Vector2(0.5f, 0.5f));
        imgComponent.sprite = s;
        Resources.UnloadUnusedAssets();
    }
    //************
    //获取并更新截屏区域(防止分辨率变化的影响scaler为当前 Canvas的scale)下面并无涉及可用new Rect(X_left, Y_down, X_right-X_left, Y_up-Y_down)代替固定分辨率
    private void Reset_image_rect()
    {
        print("canvas" + scaler.scaleFactor);

        X_left = camera_picture.transform.position.x - camera_picture.GetComponent<RectTransform>().rect.width * scaler.scaleFactor / 2;
        X_right = camera_picture.transform.position.x + camera_picture.GetComponent<RectTransform>().rect.width * scaler.scaleFactor/ 2;

        

        Y_up = camera_picture.transform.position.y + camera_picture.GetComponent<RectTransform>().rect.height * scaler.scaleFactor/ 2;
        Y_down = camera_picture.transform.position.y - camera_picture.GetComponent<RectTransform>().rect.height * scaler.scaleFactor/ 2;
    }
    public void Callback()
    {
        ui_bg.SetActive(true);
    }
    /// <summary>
    /// 截取游戏屏幕内的像素
    /// </summary>
    /// <param name="rect">截取区域:屏幕左下角为0点</param>
    /// <param name="fileName">文件名</param>
    /// <param name="callBack">截图完成回调</param>
    /// <returns></returns>
    public IEnumerator ScreenCapture(Rect rect, string fileName, CallBack callBack = null)
    {
        yield return new WaitForEndOfFrame();//等到帧结束,不然会报错
        Texture2D tex = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.ARGB32, false);//新建一个Texture2D对象
        tex.ReadPixels(rect, 0, 0);//读取像素,屏幕左下角为0点
        tex.Apply();//保存像素信息

        byte[] bytes = tex.EncodeToJPG();//将纹理数据,转化成一个png图片
                                       
        Sprite sprite = Sprite.Create(tex, new Rect(0,0, rect.width, rect.height), new Vector2 (0.5f, 0.5f));//转化为精灵  Vector2 (0.5f, 0.5f)为锚点

        StartCoroutine(Show_image(sprite));
        string base64String = Convert.ToBase64String(bytes);

        Base64ToImg(image_show, base64String);
        callBack?.Invoke();
#if UNITY_EDITOR
        UnityEditor.AssetDatabase.Refresh();//刷新Unity的资产目录
#endif
    }
    IEnumerator Show_image(Sprite sprite)
    {
        image_show.gameObject.SetActive(true);
        image_show.sprite = sprite;
        image_show.preserveAspect = true;
        image_show.transform.DOScale(Vector3.one, 0.2f);
        image_show.transform.position =transform.position;
        yield return new WaitForSeconds(0.5f);
        image_show.transform.DOScale(Vector3.zero, 0.5f);
        image_show.transform.DOMove(Manager_fan.instance.capture_parent.position, 0.5f);
        yield return new WaitForSeconds(0.5f);
        GameObject gameObject = Instantiate(Manager_fan.instance.prefabs_image, Manager_fan.instance.capture_parent);

        gameObject.GetComponent<Image>().sprite = sprite;
       image_show.gameObject.SetActive(false);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Text_input : MonoBehaviour, IPointerDownHandler
{

    public void OnPointerDown(PointerEventData eventData)
    {
        if (eventData.button == PointerEventData.InputButton.Left||
            eventData.button == PointerEventData.InputButton.Right||
            eventData.button == PointerEventData.InputButton.Middle)
        {

            if (Manager_fan.instance.Stop1 == true)
            {
                Manager_fan.instance.Delete_from_obj(this.gameObject);
            }
        }
    }

}

猜你喜欢

转载自blog.csdn.net/fanfan_hongyun/article/details/131080849