Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg

Unity屏幕截图、区域截图、读取图片、WebGL长截屏并下载到本地jpg

一、全屏截图并保存到StreamingAssets路径下
   Texture2D screenShot;//保存截取的纹理public Image image;  //显示截屏的Imagepublic void Jietu(){StartCoroutine(ScrrenCapture(new Rect(0, 0, Screen.width, Screen.height), 0));    }IEnumerator ScrrenCapture(Rect rect, int a){screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);yield return new WaitForEndOfFrame();screenShot.ReadPixels(rect, 0, 0);screenShot.Apply();yield return new WaitForSeconds(0.1f);Sprite sp = Sprite.Create(screenShot, new Rect(0, 0, screenShot.width, screenShot.height), new Vector2(0.5f, 0.5f), 100.0f);image.sprite = sp;//保存到streamingAssetsbyte[] bytes = screenShot.EncodeToJPG();string filename = Application.streamingAssetsPath + "/Images/Screenshot" + DateTime.UtcNow.Ticks + ".png";File.WriteAllBytes(filename, bytes);}
二、区域截图并保存到StreamingAssets路径下
  Texture2D screenShot;//保存截取的纹理public Image image;  //显示截屏的Imagepublic Image im;Texture2D texture2ds;//存储的截图public void Jietu(){StartCoroutine(getScreenTexture(im.rectTransform));}public IEnumerator getScreenTexture(RectTransform rectT){yield return new WaitForEndOfFrame();texture2ds = new Texture2D((int)rectT.rect.width, (int)rectT.rect.height, TextureFormat.RGB24, true);float x = rectT.localPosition.x + (Screen.width - rectT.rect.width) / 2;float y = rectT.localPosition.y + (Screen.height - rectT.rect.height) / 2;Rect position = new Rect(x, y, rectT.rect.width, rectT.rect.height);texture2ds.ReadPixels(position, 0, 0, true);//按照设定区域读取像素;注意是以左下角为原点读取texture2ds.Apply();Sprite sp = Sprite.Create(texture2ds, new Rect(0, 0, texture2ds.width, texture2ds.height), Vector2.zero);image.sprite = sp;//保存到streamingAssetsbyte[] bytes = texture2ds.EncodeToJPG();string filename = Application.streamingAssetsPath + "/Images/Screenshot" + DateTime.UtcNow.Ticks + ".png";File.WriteAllBytes(filename, bytes);}
三、unity发布WebGL屏幕长截屏并通过浏览器下载到本地jpg文件

在这里插入图片描述

using System.Collections;
using System.IO;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// unity发布WebGL屏幕长截屏并通过浏览器下载到本地jpg文件
/// </summary>
public class ScreenshotArea : MonoBehaviour
{[Header("截图区域")]public RectTransform screenshot_area;[Header("滚动条")]public Scrollbar scrollbar;[Header("截图数量")]public int number_max;[Header("每次截图滑动条vaule的位置,从下往上记")]public float[] number;[Header("是否横向合并")]public bool isHorizontal;Texture2D[] texture2ds;//存储的截图Texture2D merge_image;//合并后的图片string image_name="测试";//下载后图片的名字public RectTransform screenshot_area1;public RectTransform screenshot_area2;private void Start(){texture2ds = new Texture2D[number_max];}public void OnClick_调用(){Screen.fullScreen = true;StartCoroutine(getScreenTexture(screenshot_area));}#region 屏幕多次截图public IEnumerator getScreenTexture(RectTransform rectT){scrollbar.value = number[0];yield return new WaitForEndOfFrame();for (int i = 0; i < number_max; i++){texture2ds[i] = new Texture2D((int)rectT.rect.width, (int)rectT.rect.height, TextureFormat.RGB24, true);float x = rectT.localPosition.x + (Screen.width - rectT.rect.width) / 2;float y = rectT.localPosition.y + (Screen.height - rectT.rect.height) / 2;Rect position = new Rect(x, y, rectT.rect.width, rectT.rect.height);texture2ds[i].ReadPixels(position, 0, 0, true);//按照设定区域读取像素;注意是以左下角为原点读取texture2ds[i].Apply();if (i < number_max - 1)scrollbar.value = number[i + 1];if (i == 0){rectT = screenshot_area;}if (i == number_max - 2){rectT = screenshot_area1;}yield return new WaitForEndOfFrame();}merge_image = MergeImage(texture2ds); //图片合并
#if UNITY_EDITORbyte[] bytes = merge_image.EncodeToJPG();string filename = Application.streamingAssetsPath + "/Screenshot" + UnityEngine.Random.Range(0, 1000) + ".png";File.WriteAllBytes(filename, bytes);
#endifDownLoad(merge_image);//下载图片}#endregion#region 下载图片Sprite sprite;private void DownLoad(Texture2D screenShot){sprite = Sprite.Create(screenShot, new Rect(0, 0, screenShot.width, screenShot.height), new Vector2(0.5f, 0.5f));byte[] photoByte = getImageSprite();//获取jpeg图像的字节流if (photoByte != null){DownloadImage(photoByte, image_name+".jpg");}else{Debug.LogError("<color=red>下载失败</color>");}}private byte[] getImageSprite(){if (sprite){return sprite.texture.EncodeToJPG();}return null;}#endregion#region 调用js方法下载[DllImport("__Internal")]private static extern void ImageDownloader(string str, string fn);public void DownloadImage(byte[] imageData, string imageFileName = "newpic"){
#if UNITY_EDITORDebug.Log("<color=blue>编辑器无法下载</color>");
#elseif (imageData != null){Debug.Log("Downloading..." + imageFileName);ImageDownloader(System.Convert.ToBase64String(imageData), imageFileName);}
#endif}#endregion#region 合并多张图片public Texture2D MergeImage(Texture2D[] tex){if (tex.Length == 0)return null;//定义新图的宽高, 合并分为两种情况水平方向合并、垂直方向合并int width = 0, height = 0;for (int i = 0; i < tex.Length; i++){if (isHorizontal == false){//新图的高度height += tex[i].height;if (i > 0){//新图的宽度,这里筛选为最宽if (tex[i].width > tex[i - 1].width){width = tex[i].width;}}else width = tex[i].width; //只有一张图}else{//新图的宽度width += tex[i].width;if (i > 0){//新图的高度,这里筛选为最高if (tex[i].height > tex[i - 1].height){height = tex[i].height;}}else height = tex[i].height; //只有一张图}}//初始Texture2DTexture2D texture2D = new Texture2D(width, height);int x = 0, y = 0;for (int i = 0; i < tex.Length; i++){//取图Color32[] color = tex[i].GetPixels32(0);//赋给新图if (i > 0){if (isHorizontal == false){texture2D.SetPixels32(x, y += tex[i - 1].height, tex[i].width, tex[i].height, color); //高度}else{texture2D.SetPixels32(x += tex[i - 1].width, y, tex[i].width, tex[i].height, color); //宽度}}else{texture2D.SetPixels32(x, y, tex[i].width, tex[i].height, color);}}//应用texture2D.Apply();return texture2D;}#endregion
}
四、调用js方法下载图片

在Plugins文件夹下新建

ImageDownloader.jslib

放入下面代码

var ImageDownloaderPlugin = {ImageDownloader: function (str, fn) {console.log("start jslib download");var msg = UTF8ToString(str);var fname = UTF8ToString(fn);var contentType = 'image/jpeg';function fixBinary(bin) {var length = bin.length;var buf = new ArrayBuffer(length);var arr = new Uint8Array(buf);for (var i = 0; i < length; i++) {arr[i] = bin.charCodeAt(i);}return buf;}var binary = fixBinary(atob(msg));var data = new Blob([binary], { type: contentType });var link = document.createElement('a');link.download = fname;link.innerHTML = 'DownloadFile';link.setAttribute('id', 'ImageDownloaderLink');link.href = window.URL.createObjectURL(data);link.onclick = function () {var child = document.getElementById('ImageDownloaderLink');child.parentNode.removeChild(child);};link.style.display = 'none';document.body.appendChild(link);link.click();window.URL.revokeObjectURL(link.href);}
};
mergeInto(LibraryManager.library, ImageDownloaderPlugin)

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

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

相关文章

Moretl无人值守日志采集工具

永久免费: 至Gitee下载 使用教程: Moretl使用说明 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架…

The Rise and Potential of Large Language ModelBased Agents:A Survey---摘要、背景、引言

题目 基于大语言模型的Agent的兴起与发展前景 论文地址&#xff1a;https://arxiv.org/pdf/2309.07864.pdf 项目地址&#xff1a;https:/github.com/WooooDyy./LLM-Agent–Paper-List 摘要 长期以来&#xff0c;人类一直在追求等同于或超越人类水平的人工智能(A)&#xff0c;…

lc46全排列——回溯

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 法1&#xff1a;暴力枚举 总共n!种全排列&#xff0c;一一列举出来放入list就行&#xff0c;关键是怎么去枚举呢&#xff1f;那就每次随机取一个&#xff0c;然后删去这个&#xff0c;再从剩下的数组中继续去随机选一个&a…

Spring Boot教程之二十五: 使用 Tomcat 部署项目

Spring Boot – 使用 Tomcat 部署项目 Spring Boot 是一个基于微服务的框架&#xff0c;在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。如今&#xff0c;它正成为开发人员的最爱&#xff0c;因为它是一个…

【C语言篇】C 语言总复习(下):点亮编程思维,穿越代码的浩瀚星河

我的个人主页 我的专栏&#xff1a;C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 在C语言的世界里&#xff0c;结构体和联合体以及文件操作都是非常重要且实用的知识板块&#xff0c;掌握它们能帮助我们更高效地组织数据以及与外部文…

CNCF云原生生态版图-项目和产品综合分析

CNCF云原生生态版图-项目和产品综合分析 CNCF云原生生态版图-项目和产品综合分析整体统计分析中国研发人员贡献项目和产品其中&#xff0c;纳入 CNCF 管理的开源项目 链接 CNCF云原生生态版图-项目和产品综合分析 整体统计分析 在对云原生技术选型时&#xff0c;优先选择经过 …

VScode、Windsurf、Cursor 中 R 语言相关快捷键设置

前言 在生物信息学数据分析中&#xff0c;R语言是一个不可或缺的工具。为了提高R语言编程效率&#xff0c;合理设置快捷键显得尤为重要。本文介绍在VSCode Windsurf Cursor 中一些实用的R语言快捷键设置&#xff0c;让非 Rstudio 的 IDE 用起来得心应手&#x1f611; 操作种…

分布式任务调度平台xxl-job源码学习

XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 官网&#xff1a;https://www.xuxueli.com/xxl-job/ github&#xff1a;https://github.com/xuxueli/xxl-…

Macbookpro M1 IDEA中安装mysql

一&#xff1a;安装与连接数据库 1. 首先在mysql中创建一个初始数据库&#xff1a;idea_db&#xff0c;如示&#xff1a; 2.打开IDEA,如果最右侧没有database窗口&#xff0c;则在插件那里下载“Database navigator”,稍后重启一下即可&#xff1b; 点击最右侧Database---->…

Linux内核结构及源码概述

参考&#xff1a;深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) Linux 是一个庞大、高效而复杂的操作系统&#xff0c;虽然它的开发起始于 Linus Torvalds 一个人&#xff0c;但随着时间的推移&#xff0c;越来越多的人加入了 Linux 的开发和对它的不断完善…

[Unity] Text文本首行缩进两个字符

Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如&#xff1a; 效果&#xff1a; 代码&#xff1a; TMPtext1.text "\u3000\u3000" "选择动作类型&#xff1a;";

容器内部时间和Node时间不同步问题

之前在《 Docker及Kubernetes使用过程中出现的问题&#xff08;FAQ&#xff09;》中的“FAQ30 容器内部时间和Node时间不同”分享过容器内部和容器服务器之间时间不一致的问题&#xff1b;这通常会导致各种问题&#xff0c;比如日志记录、定时任务等。 问题原因&#xff1a;问…

AI开源南京分享会回顾录

AI 开源南京分享会&#xff0c;已于2024年11月30日下午在国浩律师&#xff08;南京&#xff09;事务所5楼会议厅成功举办。此次活动由 KCC南京、PowerData、RISC-Verse 联合主办&#xff0c;国浩律师&#xff08;南京&#xff09;事务所协办。 活动以“开源视角的 AI 对话”为主…

OpenCV 图像变换与处理实战

OpenCV快速通关 第一章&#xff1a;OpenCV 简介与环境搭建 第二章&#xff1a;OpenCV 图像基本操作 第三章&#xff1a;OpenCV 图像变换与处理实战 OpenCV 图像变换与处理实战 OpenCV快速通关OpenCV 图像变换与处理实战一、OpenCV 基础与图像处理概览二、图像变换理论精析三、…

Ubuntu22.04安装docker desktop遇到的bug

1. 确认已启用 KVM 虚拟化 如果加载了模块&#xff0c;输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能&#xff1a; 2. 下一步操作&#xff1a; Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去&#xff1a; Sign in | …

【深度学习入门】深度学习介绍

1.1 深度学习介绍 学习目标 目标 知道深度学习与机器学习的区别了解神经网络的结构组成知道深度学习效果特点 应用 无 区别 特征提取方面 机器学习的特征工程步骤是要靠手动完成的&#xff0c;而且需要大量领域专业知识深度学习通常由多个层组成&#xff0c;它们通常将更简…

实现按键按下(低电平)检测到下降沿

按照流程进行编程 步骤1&#xff1a; 初始化函数 包括时基工作参数配置 输入通道配置 更新中断使能 使能捕获、捕获中断及计数器 HAL_TIM_IC_Init(&ic_handle) //时基参数配置 HAL_TIM_IC_ConfigChannel(&ic_handle,&ic_config,TIM_CHANNEL_2) //输…

汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集

本数据集支持YOLO&#xff0c;COCO&#xff0c;VOC三种格式标记汽车车牌&#xff0c;无论是新能源汽车还是油车都能识别标记&#xff0c;该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70&#xff05; 2800图片 有效集 20&#xff05; 800图片 测…

游秦岭山感

巍乎高哉&#xff01; 悠悠大秦岭 佑吾华夏之根脉 八水润之 泽万物而赋予生机 于万山之山中 享自然之美于万物 西有昆仑祖龙脉 东有秦岭护关中 绿水青山国之本 万山长青谋发展 旭日东升耀中华 固我山河永泰安 你我同行共保护 关中龙脉更兴旺

阿里云-通义灵码:测试与实例展示

目录 一.引子 二.例子 三.优点 四.其他优点 五.总结 一.引子 在软件开发的广袤天地中&#xff0c;阿里云通义灵码宛如一座蕴藏无尽智慧的宝库&#xff0c;等待着开发者们去深入挖掘和探索。当我们跨越了入门的门槛&#xff0c;真正开始使用通义灵码进行代码生成和开发工作…