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

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

一、全屏截图并保存到StreamingAssets路径下
   Texture2D screenShot;//保存截取的纹理
    public Image image;  //显示截屏的Image
 public 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;
        
             //保存到streamingAssets
        byte[] bytes = screenShot.EncodeToJPG();
        string filename = Application.streamingAssetsPath + "/Images/Screenshot" + DateTime.UtcNow.Ticks + ".png";
        File.WriteAllBytes(filename, bytes);
            }
二、区域截图并保存到StreamingAssets路径下
  Texture2D screenShot;//保存截取的纹理
    public Image image;  //显示截屏的Image
    public 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;
         //保存到streamingAssets
        byte[] 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_EDITOR
        byte[] bytes = merge_image.EncodeToJPG();
        string filename = Application.streamingAssetsPath + "/Screenshot" + UnityEngine.Random.Range(0, 1000) + ".png";
        File.WriteAllBytes(filename, bytes);
#endif
        
        DownLoad(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_EDITOR
        Debug.Log("<color=blue>编辑器无法下载</color>");
#else
        if (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; //只有一张图
            }
        }
        //初始Texture2D
        Texture2D 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅

一、引言 结对编程作为一种软件开发方法&#xff0c;在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心&#xff0c;深入探讨时间拳击理论下的结对编程。 在当今软件开发领域&#xff0c;高效的开发方法和…

ArcGIS MultiPatch数据转换Obj数据

文章目录 ArcGIS MultiPatch数据转换Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS MultiPatch数据转换Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> Obj 2.…

HTML、CSS表格的斜表头样式设置title 画对角线

我里面有用到layui框架的影响&#xff0c;实际根据你自己的框架来小调下就可以 效果如下 上代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

DMA(Direct Memory Access):直接内存访问

DMA&#xff08;Direct Memory Access&#xff09;&#xff1a;直接内存访问 一、传统CPU存取数据 CPU不直接存取外设的原因主要有两点&#xff1a; 速度差异&#xff1a;CPU的处理速度远高于外设&#xff0c;无法直接同步。格式多样性&#xff1a;外设数据格式种类繁多&…

C语言-排序

常见的排序算法分为以下四种&#xff0c;插入排序&#xff0c;选择排序&#xff0c;交换排序&#xff0c;归并排序。 一、插入排序 (一)直接插入排序 直接插入排序&#xff0c;将一段数组看做被分成已排序序列和未排序序列&#xff0c;排序过程是从未排序序列的元素开始&…

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器&#xff0c;不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址&#xff1a; Chrome for Testing availability 我下载的是如下两个安装包&#xff0c;解压即可。 2.导包 pip install selenium然后用python代码引用即可…

【卷积神经网络】LeNet实践

模型建立 数据初始化根据模型搭建前向传播打印模型结构 前向传播数据初始化 def __init__(self):super(LeNet, self).__init__()# 第一层卷积层&#xff1a;# 输入&#xff1a;灰度图像 (1通道&#xff0c;大小 28x28)# 输出&#xff1a;6个特征图 (大小 28x28, 通过padding2保…

51c~Pytorch~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11878447 一、PyTorch与torch-xla的桥接 文章从XLATensor开始的溯源、注册PyTorch库实现、从PyTorch调用到torch_xla三个方面来介绍PyTorch与torch-xla的桥接 XLA (Accelerated Linear Algebra)是一个开源的机器学习编…

五大短视频平台变现方式

重新整理了五个短视频平台的平台特性&#xff0c;用户分析、年龄段、用户量级和各个平台的变现方式。想在这几个平台赚&#x1f4b0;的可以多看看&#xff0c;有没有适合自己的变现方式⚡ 五个短视频平台&#xff1a; 抖音、快手、哔哩哔哩、视频号、小红书

开源Java快速自测工具,可以调用系统内任意一个方法

java快速测试框架&#xff0c;可以调到系统内任意一个方法&#xff0c;告别写单测和controller的困扰。 开源地址&#xff1a;https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码&#xff0c;特别是service层或者是更底层的代码&#xff0c;就…

数据结构开始——时间复杂度和空间复杂度知识点笔记总结

好了&#xff0c;经过了漫长的时间学习c语言语法知识&#xff0c;现在我们到了数据结构的学习。 首先&#xff0c;我们得思考一下 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素…

Linux USB开发整理和随笔

目录 1 概述 2 硬件原理基础 2.1 USB发展 2.2 USB的拓扑 2.3 硬件接口 2.4 USB总线协议 2.4.1 通信过程 2.4.2 概念关系 2.4.3 管道PIPE 2.4.4 传输 2.4.5 事务 2.4.6 包结构与类型 2.4.6.1 令牌包 2.4.6.2 数据包 2.4.6.3 握手包 2.5 描述符 2.5.1 设备描述符…

一键找出图像中物体的角点

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结&#xff0c;一些及极其简单的被省略了&#xff0c;代数的概念稀碎&#xff0c;不如高数关联性高&#xff0c;所以本文仅供参考&#xff0c;做题请从中筛选&#xff01; 本文为初稿&#xff0c;后面会根据刷题和自己的理解继续更新 第一章…

警惕!手动调整服务器时间可能引发的系统灾难

警惕&#xff01;手动调整服务器时间可能引发的系统灾难 1. 鉴权机制1.1 基于时间戳的签名验证1.2 基于会话的认证机制&#xff08;JWT、TOTP&#xff09; 2. 雪花算法生成 ID 的影响2.1 时间戳回拨导致 ID 冲突2.2 ID 顺序被打乱 3. 日志记录与审计3.1 日志顺序错误3.2 审计日…

【Linux】Systemtap在CentsOS9上测试成功了

在Ubuntu上测试没有成功&#xff0c;先看看运行成功的效果吧&#xff1a; 看到运行的效果&#xff0c;可以安心些&#xff0c;哈哈 指导操作来源于这里&#xff1a;SystemTap 主要来源于这里&#xff1a; https://sourceware.org/systemtap/SystemTap_Beginners_Guide/using-s…

【EthIf-03】 EthernetInterface软件栈的文件组织结构

上图为《AUTOSAR_SWS_EthernetInterface【v2.2.0 】》给出的EthernetInterface软件栈的文件组织结构,本文主要关注arccore代码中已存在的文件的功能和作用,不知道的小伙伴可以查看🔗EthIf的文件结构中的src和inc目录下的文件有哪些: 1. 文件结构 1.1 EthIf_Cbk.h 头文…

【LeetCode刷题之路】622.设计循环队列

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…

Neo4j+Neovis+Vue3:前端连接数据库渲染

Neovis&#xff08;github&#xff09;&#xff1a;https://github.com/neo4j-contrib/neovis.js Neovis配置文档&#xff1a;neovis.js (neo4j-contrib.github.io) 一、安装Neo4j 参考文章&#xff1a;neo4j下载安装配置步骤-CSDN博客 二、Neovis使用 1.npm引入 ?npm ins…