ScreenshotMaster.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /// <summary>
  2. /// Copyright (c) 2023 MirzkisD1Ex0 All rights reserved.
  3. /// Code Version 1.0
  4. /// </summary>
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using UnityEngine;
  8. using UnityEngine.Rendering;
  9. using UnityEngine.Experimental.Rendering;
  10. using UnityEngine.UI;
  11. using System.IO;
  12. using System;
  13. using ToneTuneToolkit.Common;
  14. namespace ToneTuneToolkit.Media
  15. {
  16. public class ScreenshotMaster : SingletonMaster<ScreenshotMaster>
  17. {
  18. [SerializeField]
  19. public int _textureHight = 1024, _textureWidth = 1024;
  20. public Camera ShootingCamera;
  21. public RawImage PreviewImage;
  22. private RenderTexture _renderTexture;
  23. private void Awake()
  24. {
  25. _renderTexture = InitRenderTexture();
  26. SettingCamera(ShootingCamera);
  27. if (PreviewImage)
  28. {
  29. PreviewImage.texture = _renderTexture;
  30. }
  31. }
  32. /// <summary>
  33. /// 初始化RT
  34. /// </summary>
  35. /// <returns></returns>
  36. private RenderTexture InitRenderTexture()
  37. {
  38. RenderTexture _tempRenderTexture = new RenderTexture(_textureWidth, _textureHight, 16);
  39. _tempRenderTexture.name = "TempRenderTexutre";
  40. _tempRenderTexture.dimension = TextureDimension.Tex2D;
  41. _tempRenderTexture.antiAliasing = 1;
  42. _tempRenderTexture.graphicsFormat = GraphicsFormat.R16G16B16A16_SFloat;
  43. return _tempRenderTexture;
  44. }
  45. /// <summary>
  46. /// 设置相机
  47. /// </summary>
  48. /// <param name="tempCamera"></param>
  49. private void SettingCamera(Camera tempCamera)
  50. {
  51. tempCamera.backgroundColor = Color.clear;
  52. tempCamera.targetTexture = _renderTexture;
  53. return;
  54. }
  55. public void SaveRenderTexture(string filePath, string fileName)
  56. {
  57. RenderTexture active = RenderTexture.active;
  58. RenderTexture.active = _renderTexture;
  59. Texture2D png = new Texture2D(_renderTexture.width, _renderTexture.height, TextureFormat.ARGB32, false);
  60. png.ReadPixels(new Rect(0, 0, _renderTexture.width, _renderTexture.height), 0, 0);
  61. png.Apply();
  62. RenderTexture.active = active;
  63. byte[] bytes = png.EncodeToPNG();
  64. if (!Directory.Exists(filePath))
  65. {
  66. Directory.CreateDirectory(filePath);
  67. }
  68. FileStream fs = File.Open(filePath + fileName, FileMode.Create);
  69. BinaryWriter writer = new BinaryWriter(fs);
  70. writer.Write(bytes);
  71. writer.Flush();
  72. writer.Close();
  73. fs.Close();
  74. Destroy(png);
  75. png = null;
  76. Debug.Log("保存成功!" + filePath);
  77. return;
  78. }
  79. }
  80. }