Texture2Dのリサイズ、回転、圧縮、JPG変換

先日カメラアプリを作成した際に使ったTextrue2Dの回転、リサイズ、JPG変換を行う関数です。

リサイズ

  1. public static class Texture2DExtensions {
  2.     public static Texture2D GetResized(this Texture2D texture, int width, int height) {
  3.         // リサイズ後のサイズを持つRenderTextureを作成して書き込む
  4.         var rt = RenderTexture.GetTemporary(width, height);
  5.         Graphics.Blit(texture, rt);
  6.         // リサイズ後のサイズを持つTexture2Dを作成してRenderTextureから書き込む
  7.         var preRT = RenderTexture.active;
  8.         RenderTexture.active = rt;
  9.         var ret = new Texture2D(width, height);
  10.         ret.ReadPixels(new Rect(0, 0, width, height), 0, 0);
  11.         ret.Apply();
  12.         RenderTexture.active = preRT;
  13.         RenderTexture.ReleaseTemporary(rt);
  14.         UnityEngine.Object.Destroy(texture);//@@@ メモリーリーク注意!
  15.         return ret;
  16.     }
  17. }

 

回転

  1.  private Color32[] _rotateImg(Color32[] coler, int width, int height, int rotate) {
  2.         Color32[] rotatepix = new Color32[width * height];
  3.         int startposi = width * height – width;
  4.         int posi = 0;
  5.         if (rotate == 0) {
  6.             for (int i = 0; i < rotatepix.Length; i++) {
  7.                 rotatepix[i] = coler[i];
  8.             }
  9.         } else if (rotate == 90) {//90 画像が歪みまくってダメ
  10.             startposi = width – 1;
  11.             for (int j = 0; j < width; j++) {
  12.                 for (int i = startposi; i < rotatepix.Length; i += width) {
  13.                     rotatepix[posi] = coler[i];
  14.                     posi++;
  15.                 }
  16.                 startposi–;
  17.             }
  18.         } else if (rotate == 180) {//180度は左右反転か上下反転だからうまくいくが90度は正方形とかじゃないとうまくいかんっぽい
  19.             for (int i = (rotatepix.Length – 1); i >= 0; i–) {
  20.                 rotatepix[rotatepix.Length – 1 – i] = coler[i];
  21.             }
  22.         } else if (rotate == 270) {//270 画像が歪みまくってダメ
  23.             startposi = width * height – width;
  24.             for (int j = 0; j < width; j++) {
  25.                 for (int i = startposi; i >= 0; i -= width) {
  26.                     rotatepix[posi] = coler[i];
  27.                     posi++;
  28.                 }
  29.                 startposi++;
  30.             }
  31.         }
  32.         coler = null;
  33.         return rotatepix;
  34.     }

 

Textrue2DからColor32に入れ替えてから回転させて、Textrue2Dに戻すような流れで行いました。

  1.             Color32[] a = resultTexture[index].GetPixels32();//Texture2Dからピクセル情報を取り出す
  2.             a = _rotateImg(a, resultTexture[index].width, resultTexture[index].height, rotate);
  3.             resultTexture[index].SetPixels32(a);//ピクセル情報をTexture2Dに反映
  4.             resultTexture[index].Apply();

 90度回転(正方形でなくてもOK)

  1.     Texture2D rotateTexture(Texture2D originalTexture, bool clockwise) {
  2.         Color32[] original = originalTexture.GetPixels32();
  3.         Color32[] rotated = new Color32[original.Length];
  4.         int w = originalTexture.width;
  5.         int h = originalTexture.height;
  6.         int iRotated, iOriginal;
  7.         for (int j = 0; j < h; ++j) {
  8.             for (int i = 0; i < w; ++i) {
  9.                 iRotated = (i + 1) * h – j – 1;
  10.                 iOriginal = clockwise ? original.Length – 1 – (j * w + i) : j * w + i;
  11.                 rotated[iRotated] = original[iOriginal];
  12.             }
  13.         }
  14.         Texture2D rotatedTexture = new Texture2D(h, w);
  15.         rotatedTexture.SetPixels32(rotated);
  16.         rotatedTexture.Apply();
  17.         Destroy(originalTexture);//@@@ メモリーリーク注意
  18.         return rotatedTexture;
  19.     }

 

 JPGに変換(圧縮)

Textrue2D.EncodeToJPG(int Quality)

 

画像関係全く理解してません。とりあえず、結果は得られました。探すのに苦労したものがあったので貼っておくことにしました。

 

 

 

 

comment

タイトルとURLをコピーしました