unity(WebGL) 截图拼接并保存本地,下载PDF

这篇具有很好参考价值的文章主要介绍了unity(WebGL) 截图拼接并保存本地,下载PDF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.调用代码

2.截图 拼图 代码


截图参考:Unity3D 局部截图、全屏截图、带UI截图三种方法_unity 截图_野区捕龙为宠的博客-CSDN博客

文档下载: Unity WebGL 生成doc保存到本地电脑_unity webgl 保存文件_野区捕龙为宠的博客-CSDN博客

中文输入:Unity WebGL中文输入 支持输入法跟随 支持全屏(内附Dome)_unity中文插件-CSDN博客 

1.调用代码

话不多说直接上代码:

 private void Awake()
    {
//点击提交下载 按钮
        Btn_download.onClick.AddListener(() =>
        {
            Btn_download.gameObject.SetActive(value: false);

            GetComponent<Capture_Long>().Cap_LongTex();//截图拼图
//下载PDF
            GetComponent<Capture_Long>().CapCallBack = ((png_byte) =>
            {
                string filename = CQOOC.Instance.userName + "_" + DateTime.Now.ToString("g");
                Btn_download.gameObject.SetActive(true);
                Application.ExternalCall("downloadPng", png_byte, filename);//调用 webgl 方法

              //  Debug.Log("filename="+ filename);
            });
//上传 截图
            GetComponent<Capture_Long>().CapByteCallBack = ((png_byte) =>
            {
                string filename = CQOOC.Instance.userName + "_" + DateTime.Now.ToString("g");
                Debug.Log("filename=" + filename);
                //上传实验报告 截图
                CQOOC.Instance.UploadFile(png_byte, filename+".png", ((b) => {
                    if (b)
                    {
                        Debug.Log("上传截图成功!");
                    }
                    else
                    {
                        Debug.Log("上传截图失败!");
                    }
                }));

                //上传实验报告 数据
                CQOOC.Instance.UploadData_((b) => {
                    if (b)
                    {
                        UITipDialogMini.Instance.SetState(true, "提交数据成功!");
                    }
                    else
                    {
                        UITipDialogMini.Instance.SetState(true, "提交数据失败!");
                    }
                });

            });
        });
        DateTime now = DateTime.Now.AddMinutes(-15);
        string formattedTime = now.ToString("yyyy 年 M 月 d 日 HH:mm:ss");
        text_StartTime.text = formattedTime;

        DateTime now02 = DateTime.Now;
        string formattedTime02 = now02.ToString("yyyy 年 M 月 d 日 HH:mm:ss");
        text_EndTime.text = formattedTime02;

        // text_StartTime.text = DateTime.Now.AddMinutes(-15).ToString("F");
        //text_EndTime.text = DateTime.Now.ToString("F");

        text_UserName.text = CQOOC.Instance.userName;
        text_Score.text = UnityEngine.Random.Range(80f, 95f).ToString("0");
    }

  

 u3d 图片保存,unity,webgl,pdf

2.截图 拼图 代码

由于图片太长需要拼接

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class Capture_Long : MonoBehaviour
{
    public RectTransform svrt;
    public RectTransform contentRT;
    public Action<string> CapCallBack;
    public Action<byte[]> CapByteCallBack;
    public Vector2 vec;

    /// <summary>
    /// 接长图,进行拼接
    /// </summary>
    /// <param name="SVRT">Scroll Rect</param>
    /// <param name="ContentRT">Content</param>
    public void Cap_LongTex()
    {
        StartCoroutine(Cap(svrt, contentRT));
    }
    private IEnumerator Cap(RectTransform SVRT, RectTransform ContentRT)
    {
        //画布中的高度      950
        float SV_Y = SVRT.sizeDelta.y;

        //content显示的区域高度   0
        float Content_Y = ContentRT.anchoredPosition.y;
        //图片的整体高度   2660
        float Content_Height = contentRT.sizeDelta.y+ SV_Y;

        var mult = (float)(Content_Height / SV_Y);
        //整数倍
        int mult_int = (int)mult;
        //最后的小数倍
        float mult_float = mult - mult_int;

        //滚动条的宽度
        float verticalScrollbar_weight = SVRT.GetComponent<ScrollRect>().verticalScrollbar.GetComponent<RectTransform>().sizeDelta.x;

        yield return new WaitForEndOfFrame();

        //合成图片的总高度
        int totalHeight = (int)Content_Height;
        Texture2D endTex = new Texture2D((int)vec.y, totalHeight, TextureFormat.RGBA32, false);
        int x = 0, y = 0;
        Color32[] colors;

        //整数倍的截图
        for (int i = 0; i < mult_int; i++)
        {
            ContentRT.anchoredPosition = new Vector2(0, SV_Y * i);
            yield return new WaitForEndOfFrame();
            //Rect rect_int = new Rect(Screen.width / 2 - SVRT.sizeDelta.x / 2 + SVRT.anchoredPosition.x, Screen.height / 2 - SVRT.sizeDelta.y / 2 + SVRT.anchoredPosition.y, SVRT.sizeDelta.x - verticalScrollbar_weight, SVRT.sizeDelta.y);
            //Rect rect_int = new Rect(420, 166.5f, 1365, SVRT.sizeDelta.y);
            Rect rect_int = new Rect(420, vec.x, vec.y, SVRT.sizeDelta.y);

            var tex_int = CaptureScreenshot(rect_int, i + "");

            //合成
            colors = tex_int.GetPixels32(0);
            if (i > 0)
            {
                y -= tex_int.height;
            }
            else
            {
                y = totalHeight - tex_int.height;
            }
            endTex.SetPixels32(x, y, tex_int.width, tex_int.height, colors);
        }

        //小数倍的截图
        ContentRT.anchoredPosition = new Vector2(0, SV_Y * (mult - 1));
        yield return new WaitForEndOfFrame();
        //Rect rect_float = new Rect(Screen.width / 2 - SVRT.sizeDelta.x / 2 + SVRT.anchoredPosition.x, Screen.height / 2 - SVRT.sizeDelta.y / 2 + SVRT.anchoredPosition.y, SVRT.sizeDelta.x - verticalScrollbar_weight, SVRT.sizeDelta.y * mult_float);
        Rect rect_float = new Rect(420, vec.x, vec.y, SVRT.sizeDelta.y * mult_float);

        var tex_float = CaptureScreenshot(rect_float, "end");

        //合成
        colors = tex_float.GetPixels32(0);
        y -= tex_float.height;
        endTex.SetPixels32(x, y, tex_float.width, tex_float.height, colors);
        endTex.Apply();
        byte[] bytes = endTex.EncodeToPNG();//然后将这些纹理数据,成一个png图片文件
        var strPng = Convert.ToBase64String(bytes);

#if UNITY_EDITOR
        string filename = Application.dataPath + "/PNG/合成.png";
        System.IO.File.WriteAllBytes(filename, bytes);
        Debug.Log(string.Format("截屏了一张图片: {0}", filename));
#endif

        SVRT.GetComponent<ScrollRect>().verticalNormalizedPosition = 1;
        CapCallBack?.Invoke(strPng);

        CapByteCallBack?.Invoke(bytes);
    }

    /// <summary>
    /// 开始截图
    /// </summary>
    /// <returns>The screenshot2.</returns>
    /// <param name="rect">Rect.截图的区域,左下角为o点</param>
    private Texture2D CaptureScreenshot(Rect rect, string name)
    {
        //Debug.Log(rect.ToString());
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGBA32, false);//先创建一个的空纹理,大小可根据实现需要来设置
        screenShot.ReadPixels(rect, 0, 0);//读取屏幕像素信息并存储为纹理数据,
        screenShot.Apply();

#if UNITY_EDITOR
        byte[] bytes = screenShot.EncodeToPNG();//然后将这些纹理数据,成一个png图片文件
        string filename = Application.dataPath + "/PNG/Screenshot" + name + ".png";
        System.IO.File.WriteAllBytes(filename, bytes);
        //Debug.Log(string.Format("截屏了一张图片: {0}", filename));
#endif
        return screenShot;
    }
}

3.web端代码文章来源地址https://www.toymoban.com/news/detail-774456.html

<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>XiaoLuoDai</title>
    <link rel="shortcut icon" href="TemplateData/favicon.ico">
    <link rel="stylesheet" href="TemplateData/style.css">
    <script src="TemplateData/UnityProgress.js"></script>
    <script src="Build/UnityLoader.js"></script>
    <script>
	
      var unityInstance = UnityLoader.instantiate("unityContainer", "Build/WebGL.json", {onProgress: UnityProgress});
	  
	   function GetWebGLURI()
        {
        unityInstance.SendMessage("CQOOC", "GetURI_CallBack", window.location.href);
        }
    </script>
	 <script src="https://cdn.bootcss.com/jspdf/1.3.4/jspdf.debug.js"></script>
	<script>
	  function downloadPng(base64, filename) {
	      var baseData = 'data:image/png;base64,' + base64
	          ///
	          // 获取图片文件的宽高
	          ///
	          let image = new Image();
	      image.src = baseData;
	      image.onload = function () {
	          console.log(image.width, image.height);
	          var contentWidth = image.width;
	          var contentHeight = image.height;

	          //一页pdf显示html页面生成的canvas高度;
	          var pageHeight = contentWidth / 592.28 * 841.89;
	          //未生成pdf的html页面高度
	          var leftHeight = contentHeight;
	          //页面偏移
	          var position = 0;
	          //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
	          var imgWidth = 595.28;
	          var imgHeight = 592.28 / contentWidth * contentHeight;
	          //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
	          //当内容未超过pdf一页显示的范围,无需分页

	          var pdf = new jsPDF('', 'pt', 'a4');
	          if (leftHeight < pageHeight) {
	              pdf.addImage(baseData, 'PNG', 0, 0, imgWidth, imgHeight);
	          } else {
	              while (leftHeight > 0) {
	                  pdf.addImage(baseData, 'PNG', 0, position, imgWidth, imgHeight)
	                  leftHeight -= pageHeight;
	                  position -= 841.89;
	                  //避免添加空白页
	                  if (leftHeight > 0) {
	                      pdf.addPage();
	                  }
	              }
	          }
	          pdf.save(filename + ".pdf")
	      }
	  }
	</script>
<script>
      function FullScreenMetthod()//中文输入
	  {
		document.getElementById('unityContainer').requestFullscreen();
	  }
  </script>
  </head>
  <body>
    <div class="webgl-content">
      <div id="unityContainer" style="width: 1920px; height: 1080px"></div>
      <div class="footer">
        <div class="webgl-logo"></div>
        <div class="fullscreen" onclick="FullScreenMetthod()"></div>
        <div class="title">XiaoLuoDai</div>
      </div>
    </div>
  </body>
</html>

到了这里,关于unity(WebGL) 截图拼接并保存本地,下载PDF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用谷歌浏览器打开本地unity webgl报错

    unity打包webgl,双击index.html,用谷歌浏览器打开,报错: Failed to download file Build/Test4_Build_WebGL.framework.js.unityweb. Loading web pages via a file:// URL without a web server is not supported by this browser. Please use a local development web server to host Unity content, or use the Unity Build and Run option. 可以把文件放到

    2024年02月11日
    浏览(69)
  • Unity 发布WebGL、去Logo、网络端通信 、本地运行

    以下内容将和大家详细分享 Unity 在 WebGL平台的发布方法、 如何去除unity的Logo和加载界面、 WebGL与网络端通信 、以及 如何在本地运行html。 一、Unity在 WebGL平台的发布方法 1、如下图,选择webgl平台,没安装的点击下载安装。  安装后如图。  选择需要打包的场景,无特殊要求

    2024年02月06日
    浏览(43)
  • 【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署

    本文是Unity3D贪吃蛇游戏从制作到部署的相关细节 项目开源代码:https://github.com/zstar1003/3D_Snake 试玩链接:http://xdxsb.top/Snake_Game_3D 效果预览: 试玩链接中的内容会和该效果图略有不同,后面会详细说明。 经典贪吃蛇游戏:蛇身随着吃食物的增加不断变长,通过A/D或方向键←→

    2024年02月07日
    浏览(52)
  • Unity导出WebGL工程,并部署本地web服务器

    在Build Settings-PlayerSettings-Other Settings-Rendering 将Color Space 设置为Gamma 将Lightmap Encoding 设置为NormalQuality 在Build Settings-PlayerSettings-Publishing Settings 勾选Decompression Fallback 完成配置修改之后,可以直接在Build界面选择Build And Run,构建结束后会由Unity自动部署,可以正常打开网页。 如果

    2023年04月19日
    浏览(53)
  • Unity WebGL项目打包后本地打开报错问题解决方法

    在Unity打包WebGL项目后,本地打开html页面出现错误提示。 Failed to download file Build/Unity Web.data.gz. Loading web pages via a file:// URL without a web server is not supported by this browser.   在网上试了好几种方法,综合起来终于跑起来了。以下是解决步骤: 1. 打开Web服务 ,打开控制面板--程序--启

    2024年02月14日
    浏览(75)
  • Unity3D中打包WEBGL后读取本地文件数据+网络请求

    首先上一编博主运行html之后报的错误:提示内存不足!!!! 1.首先排查一下webgl包的大小,不能超过2G。 2.F12查看具体错误,在这里博主的是:        a:本地读取StreamingAssets里的配置文件,序列化失败。        b:网络请求方法不能使用JsonConvert.SerializeObject将对象重新序列

    2024年02月08日
    浏览(58)
  • uniapp下载文件保存到手机本地

    最近接到一个项目需求,下载各种格式文件保存到手机本地 遇到的问题如下: 1、iphone手机无法保存到文件中 2、Android手机文件保存的位置不易查找 3、Android手机文件存储名称非文件原名,而是以时间戳命名 不可抗因素:   1、iphone自带的文件管理功能不能自动扫描各个APP下

    2024年02月11日
    浏览(47)
  • Unity 保存图片到本地

    2024年02月05日
    浏览(49)
  • Unity保存日记到本地

    2024年02月06日
    浏览(39)
  • 【下载文件】uniapp开发小程序,下载文件并保存到本地

    1.1实现效果:点击文件附件,下载到本地 1.2具体代码: 2.1:效果图 保存方式是:点击下载按钮,通过微信选择一个好友,发给给好友的方式,进行保存。 2.2实现代码: 下载按钮: js:

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包