先日カメラアプリを作成した際に使ったTextrue2Dの回転、リサイズ、JPG変換を行う関数です。
リサイズ
- public static class Texture2DExtensions {
- public static Texture2D GetResized(this Texture2D texture, int width, int height) {
- // リサイズ後のサイズを持つRenderTextureを作成して書き込む
- var rt = RenderTexture.GetTemporary(width, height);
- Graphics.Blit(texture, rt);
- // リサイズ後のサイズを持つTexture2Dを作成してRenderTextureから書き込む
- var preRT = RenderTexture.active;
- RenderTexture.active = rt;
- var ret = new Texture2D(width, height);
- ret.ReadPixels(new Rect(0, 0, width, height), 0, 0);
- ret.Apply();
- RenderTexture.active = preRT;
- RenderTexture.ReleaseTemporary(rt);
- UnityEngine.Object.Destroy(texture);//@@@ メモリーリーク注意!
- return ret;
- }
- }
回転
- private Color32[] _rotateImg(Color32[] coler, int width, int height, int rotate) {
- Color32[] rotatepix = new Color32[width * height];
- int startposi = width * height – width;
- int posi = 0;
- if (rotate == 0) {
- for (int i = 0; i < rotatepix.Length; i++) {
- rotatepix[i] = coler[i];
- }
- } else if (rotate == 90) {//90 画像が歪みまくってダメ
- startposi = width – 1;
- for (int j = 0; j < width; j++) {
- for (int i = startposi; i < rotatepix.Length; i += width) {
- rotatepix[posi] = coler[i];
- posi++;
- }
- startposi–;
- }
- } else if (rotate == 180) {//180度は左右反転か上下反転だからうまくいくが90度は正方形とかじゃないとうまくいかんっぽい
- for (int i = (rotatepix.Length – 1); i >= 0; i–) {
- rotatepix[rotatepix.Length – 1 – i] = coler[i];
- }
- } else if (rotate == 270) {//270 画像が歪みまくってダメ
- startposi = width * height – width;
- for (int j = 0; j < width; j++) {
- for (int i = startposi; i >= 0; i -= width) {
- rotatepix[posi] = coler[i];
- posi++;
- }
- startposi++;
- }
- }
- coler = null;
- return rotatepix;
- }
Textrue2DからColor32に入れ替えてから回転させて、Textrue2Dに戻すような流れで行いました。
- Color32[] a = resultTexture[index].GetPixels32();//Texture2Dからピクセル情報を取り出す
- a = _rotateImg(a, resultTexture[index].width, resultTexture[index].height, rotate);
- resultTexture[index].SetPixels32(a);//ピクセル情報をTexture2Dに反映
- resultTexture[index].Apply();
90度回転(正方形でなくてもOK)
- Texture2D rotateTexture(Texture2D originalTexture, bool clockwise) {
- Color32[] original = originalTexture.GetPixels32();
- Color32[] rotated = new Color32[original.Length];
- int w = originalTexture.width;
- int h = originalTexture.height;
- int iRotated, iOriginal;
- for (int j = 0; j < h; ++j) {
- for (int i = 0; i < w; ++i) {
- iRotated = (i + 1) * h – j – 1;
- iOriginal = clockwise ? original.Length – 1 – (j * w + i) : j * w + i;
- rotated[iRotated] = original[iOriginal];
- }
- }
- Texture2D rotatedTexture = new Texture2D(h, w);
- rotatedTexture.SetPixels32(rotated);
- rotatedTexture.Apply();
- Destroy(originalTexture);//@@@ メモリーリーク注意
- return rotatedTexture;
- }
JPGに変換(圧縮)
Textrue2D.EncodeToJPG(int Quality)
画像関係全く理解してません。とりあえず、結果は得られました。探すのに苦労したものがあったので貼っておくことにしました。
comment