Unity开发笔记:截取指定位置含有UI的场景截图并输出

学习记录整理,自用,也希望能帮助到有相同需求的人。
如果直接截全图:

        string screenshotName = "Assets/Textures/UI/20230803/2.png";ScreenCapture.CaptureScreenshot(screenshotName);

截取指定位置含有UI的场景截图:
例如这种情况下只想要中间的:
在这里插入图片描述

UI所在的Canvas设置为RenderMode.ScreenSpaceCamera并挂载相机,然后设置该相机的渲染RenderTexture并开始render,注意这里渲染是从屏幕中心扩展到四周,也就是说RenderTexture小于屏幕的话只能看到中间部分,然后代码如下,已添加注释。
函数中0、1、2三张图只是为了表明ReadPixels中坐标具体参数细节,可删去。
为了方便,我直接使用我的图片的固定大小500*500,自用可以自行获取所需图片尺寸。

注意

    //电脑上:ReadPixels截取Rect部分内容是以左上角为原点,右方为x轴正向下方为y轴正向//安卓手机上:ReadPixels截取Rect部分内容是以左下角为原点,右方为x轴正向上方为y轴正向//ReadPixels输出到uiTexture部分内容是以左下角为原点,右方为x轴正向上方为y轴正向
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class TextureExporter : MonoBehaviour
{public Texture2D textureToExport;public string exportPath = "Assets/ExportedImages/";public RectTransform uiRectTransform; public Camera mainCamera;private void Start(){ExportUIAsImage(exportPath);string screenshotName = "Assets/ExportedImages/5.png";ScreenCapture.CaptureScreenshot(screenshotName);}public void ExportUIAsImage(string path){GameObject cameraObj = new GameObject("MyCamera");Camera cameraComponent = cameraObj.AddComponent<Camera>();// 获取UI元素所在的Canvas组件Canvas canvas = uiRectTransform.GetComponentInParent<Canvas>();canvas.renderMode = RenderMode.ScreenSpaceCamera;canvas.worldCamera = cameraComponent;// 获取 UI 的宽度和高度float width = 1080;float height = 1920;// 创建 RenderTexture 来保存 UI 的截屏RenderTexture renderTexture = new RenderTexture( 1080,1920, 24);Camera mainCamera = cameraComponent;// 将 UI 渲染到 RenderTexture 中mainCamera.targetTexture = renderTexture;mainCamera.Render();// 保存当前 RenderTexture 作为激活的 RenderTextureRenderTexture currentRT = RenderTexture.active;RenderTexture.active = renderTexture;// 创建一个新的 Texture2D 来保存截屏数据Texture2D uiTexture = new Texture2D((int)width, (int)height, TextureFormat.RGB24, false);Texture2D uiTexture1 = new Texture2D(500, 500, TextureFormat.RGB24, false);Vector3 localTopLeft = new Vector3(uiRectTransform.rect.xMin, uiRectTransform.rect.yMax, 0f);// 将本地坐标转换为屏幕坐标Vector3 screenTopLeft = uiRectTransform.TransformPoint(localTopLeft);Vector3 screenPoint = cameraComponent.WorldToScreenPoint(screenTopLeft);uiTexture1.ReadPixels(new Rect(screenPoint.x, 1920- screenPoint.y, 500, 500), 0, 0);uiTexture1.Apply();// 将 Texture2D 保存为图片文件byte[] imageBytes1 = uiTexture1.EncodeToPNG(); System.IO.File.WriteAllBytes(exportPath + "/4.png", imageBytes1);//ReadPixels截取Rect部分内容是以左上角为原点,右方为x轴正向下方为y轴正向//ReadPixels输出到uiTexture部分内容是以左下角为原点,右方为x轴正向上方为y轴正向uiTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);uiTexture.Apply();// 将 Texture2D 保存为图片文件byte[]imageBytes = uiTexture.EncodeToPNG(); // 或者使用 EncodeToJPGSystem.IO.File.WriteAllBytes(exportPath + "/0.png", imageBytes);uiTexture.ReadPixels(new Rect(0, 0, width-500, height - 500), 0, 0);uiTexture.Apply();// 将 Texture2D 保存为图片文件imageBytes = uiTexture.EncodeToPNG(); System.IO.File.WriteAllBytes(exportPath + "/1.png", imageBytes);uiTexture.ReadPixels(new Rect(500, 0, width - 500, height - 500), 0, 0);uiTexture.Apply();// 将 Texture2D 保存为图片文件imageBytes = uiTexture.EncodeToPNG(); // 或者使用 EncodeToJPGSystem.IO.File.WriteAllBytes(exportPath + "/2.png", imageBytes);// 清理资源mainCamera.targetTexture = null;RenderTexture.active = currentRT;Destroy(uiTexture);Destroy(renderTexture);Debug.Log("UI 已导出为图片至:" + exportPath + "/screenshot.png");}
};

输出情况:

在这里插入图片描述
0和5直接签全图效果一样。
0:
在这里插入图片描述

1:
在这里插入图片描述

2:
在这里插入图片描述

4:
在这里插入图片描述

5:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/66476.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概念解析 | 知识蒸馏(Knowledge Distillation)

教师指点弟子 - 深度神经网络知识蒸馏技术详解 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:知识蒸馏(Knowledge Distillation)。 Knowledge Distillation(知识蒸馏)Review–20篇paper回顾- 知乎 知识蒸馏(Knowledge Dist…

大专同事,7天开发了一套应用管理系统

目录 一、前言 二、如何基于工具实现应用开发&#xff1f; 三、低代码基本功能及操作 体验过程&#xff1a; 01、连接数据源 02、设计表单 03、流程设计 04、图表呈现 05、组织架构设置 五、效率评价 六、小结 一、前言 众所周知&#xff0c;每家公司在发展过程中都需要构建大量…

使用雅克比矩阵计算Rossler映射的lyapunov exponent图谱

Rossler映射如下: 雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次:…

HTML和JavaScript实现一个简单的计算器

使用HTML和JavaScript实现一个简单的计算器。 一、绘制键盘 <!DOCTYPE html> <html> <head><title>Simple Calculator</title><style>.calculator {display: grid;grid-template-columns: repeat(4, 1fr);grid-gap: 5px;padding: 10px;}.…

使用chatGPT生成提示词,在文心一言生成装修概念图

介绍 家是情感的港湾&#xff0c;而家居装修则是将情感融入空间的艺术。如何在有限的空间里展现个性与美感&#xff0c;成为了现代人关注的焦点。而今&#xff0c;随着人工智能的发展&#xff0c;我们发现了一个新的创意助手——ChatGPT&#xff0c;它不仅为我们带来了更多可能…

锐捷无线产品运维

目录 登录AP产品 Console登录&#xff08;只可以现场登录&#xff09; Web/Telnet/SSH登录&#xff08;可以现场、远程登录&#xff09; 配置AP的管理地址 通过Web界面远程登录 通过Telnet、SSH等命令行的方式登录 登录AC产品 Console登录&#xff08;只可以现场登录&a…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时&#xff0c;殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间&#xff0c;不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息&#xff0c;而这一切我们却毫不知情。这是一种网络上常见的“中间…

小鹏G9高压电驱动800V拆解【实拍】

目前已知G9基于800V 电池系统和Sic电驱系统进行开发。但这一系统的具体参数、技术水平都尚无官方解析。这里基于欣旺达的sfc480电池发布会ppt资料(图1)&#xff0c;可以看出欣旺达的4c电池满电电压在4.4V&#xff0c;这和taycan 4S的800v系统最大电压基本相同&#xff0c;电池系…

GIT结合Maven对源码以及jar包的管理建设

一、GIT管理规范 1.1 git分支概念 develop分支 开发分支,不管是要做新的feature还是需要做bug修复,都是从这个分支分出来做。 在这个分支下主要负责记录开发状态下相对稳定的版本,即完成了某个feature或者修复了某个bug后的开发稳定版本。 feature-*-*分支 feature-姓名…

springBoot 集中配置管理

springBoot 集中配置管理 项目配置如果上线项目&#xff0c;运维或者开发者可以直接和jar包同目录下创建文件&#xff0c;然后更改属性 项目配置 创建文件&#xff0c;调整配置如果上线项目&#xff0c;运维或者开发者可以直接和jar包同目录下创建文件&#xff0c;然后更改 属…

django中使用bootstrap-datepicker时间插件

1、插件的下载 Bootstrap Datepicker是一款基 于Bootstrap框架的日期选择控件&#xff0c;可以方便地在Web应用中添加可交互的日期选择功能。Bootstrap Datepicker拥有丰富的选项和API,支持多种日期格式&#xff0c;可以自定义样式并支持各种语言。 Bootstrap Datepicker 依赖…

万物识别RAM:图像识别模型,Zero-Shot超越有监督

文章目录 项目地址RAM的优势RAM的创新点总结与展望大语言模型(Large Language Models)已经给自然语言处理(NLP)领域带来了新的革命。在计算机视觉(CV)领域,Facebook近期推出的Segment Anything Model(SAM)工作,在视觉定位(Localization)任务上取得了令人振奋的结果…