根据物体的Rect大小截图区域内容
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class CaptureComponent : MonoBehaviour
{
    private Camera _uguiCamera;
    private RectTransform rectTransform;

    private string basePath;
    private void Awake()
    {
        _uguiCamera = GameObject.FindGameObjectWithTag("GuiCamera").GetComponent<Camera>();
        rectTransform = this.GetComponent<RectTransform>();
        basePath = Application.persistentDataPath + "/share/";
        if (!Directory.Exists(basePath)) Directory.CreateDirectory(basePath);
    }

    public void CaptureScreenByRect(Action<string> cb,string name="")
    {
        if (string.IsNullOrEmpty(name))
        {
            name = basePath + UnityExtends.Calculationmd5(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.ffff"))+".png";
        }
        StartCoroutine(CaptureScreenAsync(name, cb));
    }

    public IEnumerator CaptureScreenAsync(string path, Action<string> cb)
    {
        yield return new WaitForEndOfFrame();
        try
        {
            if (path != "")
            {
                Rect rect = rectTransform.rect;
                Vector3 startWorldPos = rectTransform.TransformPoint(rect.x, rect.y, 0);
                Vector3 endWorldPos = rectTransform.TransformPoint(rect.x + rect.width, rect.y + rect.height,0);
                startWorldPos.z = 0;
                endWorldPos.z = 0;
                Vector3 startViewPos = _uguiCamera.WorldToViewportPoint(startWorldPos);
                Vector3 endViewPos = _uguiCamera.WorldToViewportPoint(endWorldPos);
                rect.x = Screen.width * startViewPos.x;
                rect.y = Screen.height * startViewPos.y;
                rect.width = Screen.width * (endViewPos.x - startViewPos.x);
                rect.height = Screen.height * (endViewPos.y - startViewPos.y);

                if (rect.x < 0 || rect.y < 0 || (rect.x + rect.width) > Screen.width || (rect.y + rect.height) > Screen.height)
                {
                    //读取屏幕像素越界,界面不要超过屏幕显示区域
                    Debug.Log("窗体超过屏幕");
                    cb?.Invoke("");
                }
                else
                {
                    //Debug.Log(rect.width + " " + rect.height);
                    Texture2D capture = new Texture2D((int)(rect.width), (int)(rect.height), TextureFormat.RGB24, false);

                    capture.ReadPixels(rect, 0, 0);
                    capture.Apply();

                    byte[] datas = capture.EncodeToPNG();
                    File.WriteAllBytes(path, datas);
                    if (cb != null)
                    {
                        Debug.Log(path);
                        cb(path);
                    }
                }
            }
            else
                cb?.Invoke("");

        }
        catch (Exception e)
        {
            Debug.LogError("CaptureScreenByRect:" + e.Message);
        }

    }
}



首页 我的博客
粤ICP备17103704号