TextureExam.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine.UI;
  5. public class TextureExam : MonoBehaviour
  6. {
  7. public int CurIndex;
  8. public Image CurImage;
  9. public SpriteRenderer CurSR;
  10. public InputField InputField;
  11. public Camera Camera;
  12. public Transform ExamParent;
  13. public Sprite OriginSprite;
  14. public Texture2D OriginTexture;
  15. public Vector3 OriginSize;
  16. public void ZoomIn()
  17. {
  18. Camera.orthographicSize = 1.5f;
  19. }
  20. public void ZoomOut()
  21. {
  22. Camera.orthographicSize = 5f;
  23. }
  24. public void MoveUp()
  25. {
  26. Camera.transform.position += new Vector3(0, 0.25f, 0);
  27. }
  28. public void MoveDown()
  29. {
  30. Camera.transform.position += new Vector3(0, -0.25f, 0);
  31. }
  32. public void MoveLeft()
  33. {
  34. Camera.transform.position += new Vector3(-0.25f, 0, 0);
  35. }
  36. public void MoveRight()
  37. {
  38. Camera.transform.position += new Vector3(0.25f,0,0);
  39. }
  40. public void MoveToCenter()
  41. {
  42. Camera.transform.position = new Vector3(0, 0, -30);
  43. }
  44. public void Next()
  45. {
  46. if (CurIndex < ExamParent.childCount - 1)
  47. {
  48. if (CurImage != null)
  49. {
  50. CurImage.SetActive(false);
  51. }
  52. if (CurSR != null)
  53. {
  54. CurSR.SetActive(false);
  55. }
  56. CurIndex++;
  57. CurImage = ExamParent.GetChild(CurIndex).GetComponent<Image>();
  58. CurSR = ExamParent.GetChild(CurIndex).GetComponent<SpriteRenderer>();
  59. if (CurImage != null)
  60. {
  61. OriginSprite = CurImage.sprite;
  62. OriginTexture = CurImage.sprite.texture;
  63. CurImage.SetActive(true);
  64. }
  65. if (CurSR != null)
  66. {
  67. OriginSize = CurSR.transform.localScale;
  68. OriginSprite = CurSR.sprite;
  69. OriginTexture = CurSR.sprite.texture;
  70. CurSR.SetActive(true);
  71. }
  72. }
  73. }
  74. public void Previous()
  75. {
  76. if (CurIndex > 0)
  77. {
  78. if (CurImage != null)
  79. {
  80. CurImage.SetActive(false);
  81. }
  82. if (CurSR != null)
  83. {
  84. CurSR.SetActive(false);
  85. }
  86. CurIndex--;
  87. CurImage = ExamParent.GetChild(CurIndex).GetComponent<Image>();
  88. CurSR = ExamParent.GetChild(CurIndex).GetComponent<SpriteRenderer>();
  89. if (CurImage != null)
  90. {
  91. OriginSprite = CurImage.sprite;
  92. OriginTexture = CurImage.sprite.texture;
  93. CurImage.SetActive(true);
  94. }
  95. if (CurSR != null)
  96. {
  97. OriginSize = CurSR.transform.localScale;
  98. OriginSprite = CurSR.sprite;
  99. OriginTexture = CurSR.sprite.texture;
  100. CurSR.SetActive(true);
  101. }
  102. }
  103. }
  104. public void Scale()
  105. {
  106. float factor = float.Parse(InputField.text);
  107. Texture2D newTexture = ScaleTextureCore(1, factor, OriginTexture);
  108. newTexture.Apply();
  109. Vector2 pivot = new Vector2(OriginSprite.pivot.x/OriginSprite.rect.width, OriginSprite.pivot.y / OriginSprite.rect.height);
  110. Sprite newSprite = Sprite.Create(newTexture, new Rect(0, 0, newTexture.width, newTexture.height), pivot, OriginSprite.pixelsPerUnit, 1, SpriteMeshType.Tight, OriginSprite.border);
  111. if (CurSR != null)
  112. {
  113. CurSR.sprite = newSprite;
  114. CurSR.transform.localScale = OriginSize/factor;
  115. }
  116. if (CurImage != null)
  117. {
  118. CurImage.sprite = newSprite;
  119. }
  120. }
  121. protected Texture2D ScaleTextureCore(int padding, float factor, Texture2D sourceTexture)
  122. {
  123. if (factor.Equal(1))
  124. {
  125. Texture2D texture2D = new Texture2D(sourceTexture.width, sourceTexture.height);
  126. texture2D.SetPixels(sourceTexture.GetPixels());
  127. return texture2D;
  128. }
  129. Texture2D texture = AddPaddingToTexture(padding, sourceTexture);
  130. int originWidth = texture.width;
  131. int originHeight = texture.height;
  132. int newWidth = (int)(originWidth * factor);
  133. int newHeight = (int)(originHeight * factor);
  134. Texture2D newTexture = new Texture2D(newWidth, newHeight);
  135. Color[] newColors = new Color[newWidth * newHeight];
  136. for (int i = 0; i < newHeight; i++)
  137. {
  138. for (int j = 0; j < newWidth; j++)
  139. {
  140. newColors[i*newWidth + j] = texture.GetPixelBilinear((j + 0.5f)/newWidth, (i + 0.5f)/newHeight);
  141. }
  142. }
  143. newTexture.SetPixels(newColors);
  144. return newTexture;
  145. }
  146. protected Texture2D AddPaddingToTexture(int padding, Texture2D texture)
  147. {
  148. if (padding == 0)
  149. {
  150. return texture;
  151. }
  152. int originWidth = texture.width;
  153. int originHeight = texture.height;
  154. int newWidth = originWidth + 2 * padding;
  155. int newHeight = originHeight + 2 * padding;
  156. Texture2D newTexture = new Texture2D(newWidth, newHeight);
  157. Color[] newColors = new Color[newWidth * newHeight];
  158. Color[] originColors = texture.GetPixels();
  159. for (int i = 0; i < originHeight; i++)
  160. {
  161. for (int j = 0; j < originWidth; j++)
  162. {
  163. newColors[(i + padding) * newWidth + (j + padding)] = originColors[i * originWidth + j];
  164. }
  165. }
  166. newTexture.SetPixels(newColors);
  167. return newTexture;
  168. }
  169. }