Base64Sprites.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System;
  2. using System.Linq;
  3. using System.Reflection;
  4. using System.Text.RegularExpressions;
  5. using UnityEngine;
  6. namespace SongBrowser.UI
  7. {
  8. class Base64Sprites
  9. {
  10. public static Sprite StarFullIcon;
  11. public static Sprite SpeedIcon;
  12. public static Sprite GraphIcon;
  13. public static Sprite DeleteIcon;
  14. public static Sprite XIcon;
  15. public static Sprite DoubleArrow;
  16. public static Sprite RandomIcon;
  17. public static Sprite NoteStartOffsetIcon;
  18. public static void Init()
  19. {
  20. SpeedIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.Speed.png");
  21. GraphIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.Graph.png");
  22. XIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.X.png");
  23. StarFullIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.StarFull.png");
  24. DeleteIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.DeleteIcon.png");
  25. DoubleArrow = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.DoubleArrow.png");
  26. RandomIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.RandomIcon.png");
  27. NoteStartOffsetIcon = Base64Sprites.LoadSpriteFromResources("SongBrowser.Assets.NoteStartOffset.png");
  28. }
  29. public static string SpriteToBase64(Sprite input)
  30. {
  31. return Convert.ToBase64String(input.texture.EncodeToPNG());
  32. }
  33. public static Sprite Base64ToSprite(string base64)
  34. {
  35. // prune base64 encoded image header
  36. Regex r = new Regex(@"data:image.*base64,");
  37. base64 = r.Replace(base64, "");
  38. Sprite s = null;
  39. try
  40. {
  41. Texture2D tex = Base64ToTexture2D(base64);
  42. s = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), (Vector2.one / 2f));
  43. }
  44. catch (Exception)
  45. {
  46. Console.WriteLine("Exception loading texture from base64 data.");
  47. s = null;
  48. }
  49. return s;
  50. }
  51. public static Texture2D Base64ToTexture2D(string encodedData)
  52. {
  53. byte[] imageData = Convert.FromBase64String(encodedData);
  54. int width, height;
  55. GetImageSize(imageData, out width, out height);
  56. Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB32, false, true);
  57. texture.hideFlags = HideFlags.HideAndDontSave;
  58. texture.filterMode = FilterMode.Trilinear;
  59. texture.LoadImage(imageData);
  60. return texture;
  61. }
  62. private static void GetImageSize(byte[] imageData, out int width, out int height)
  63. {
  64. width = ReadInt(imageData, 3 + 15);
  65. height = ReadInt(imageData, 3 + 15 + 2 + 2);
  66. }
  67. private static int ReadInt(byte[] imageData, int offset)
  68. {
  69. return (imageData[offset] << 8) | imageData[offset + 1];
  70. }
  71. public static Texture2D LoadTextureRaw(byte[] file)
  72. {
  73. if (file.Count() > 0)
  74. {
  75. Texture2D Tex2D = new Texture2D(2, 2);
  76. if (Tex2D.LoadImage(file))
  77. return Tex2D;
  78. }
  79. return null;
  80. }
  81. public static Texture2D LoadTextureFromResources(string resourcePath)
  82. {
  83. return LoadTextureRaw(GetResource(Assembly.GetCallingAssembly(), resourcePath));
  84. }
  85. public static Sprite LoadSpriteRaw(byte[] image, float PixelsPerUnit = 100.0f)
  86. {
  87. return LoadSpriteFromTexture(LoadTextureRaw(image), PixelsPerUnit);
  88. }
  89. public static Sprite LoadSpriteFromTexture(Texture2D SpriteTexture, float PixelsPerUnit = 100.0f)
  90. {
  91. if (SpriteTexture)
  92. return Sprite.Create(SpriteTexture, new Rect(0, 0, SpriteTexture.width, SpriteTexture.height), new Vector2(0, 0), PixelsPerUnit);
  93. return null;
  94. }
  95. public static Sprite LoadSpriteFromResources(string resourcePath, float PixelsPerUnit = 100.0f)
  96. {
  97. return LoadSpriteRaw(GetResource(Assembly.GetCallingAssembly(), resourcePath), PixelsPerUnit);
  98. }
  99. public static byte[] GetResource(Assembly asm, string ResourceName)
  100. {
  101. System.IO.Stream stream = asm.GetManifestResourceStream(ResourceName);
  102. byte[] data = new byte[stream.Length];
  103. stream.Read(data, 0, (int)stream.Length);
  104. return data;
  105. }
  106. }
  107. }