Open10

[Unity]端末のライブラリから画像を読み込んだ画像をリサイズしてFirebaseにアップロードしたい

読み込みたい。
「Unity image picker」で検索。

読み込むだけは↑でできちゃったので改題した。
・before

[Unity]端末のライブラリから画像を読み込んで表示したい

・after

[Unity]端末のライブラリから画像を読み込んだ画像をリサイズしてFirebaseにアップロードしたい

というわけで次はリサイズ。
ファイルの圧縮したいなと思ったけどリサイズ(縮小)だけで良い気がした。
(そもそも圧縮と縮小の違いって?

圧縮と縮小の違いは、画像のサイズ、つまり大きさが変化するということです。圧縮の場合はあくまでも間引いているので画像の大きさは変わりません。例えば100ピクセル四方の正方形のファイルを圧縮しても100ピクセル四方の正方形のままですが、縮小の場合、50%にすると50ピクセル四方の正方形になります。
https://e-web.work/picture_small

うん今回は縮小だけでいいや

https://stackoverflow.com/questions/4427059/how-to-change-resolution-dpi-of-an-image
これがよさそう?
↓サンプルコード
using (Bitmap bitmap = (Bitmap)Image.FromFile("file.jpg"))
{
    using (Bitmap newBitmap = new Bitmap(bitmap))
    {
        newBitmap.SetResolution(300, 300);
        newBitmap.Save("file300.jpg", ImageFormat.Jpeg);
    }
}

jpgかpngかで分ける必要ありそう
それ以外にあるかな?
たまにjpegって拡張子見るけど違いあるのかな

端的に言うと、この2つは表記されている拡張子が違うだけで、機能面での違いはありません。
https://ferret-plus.com/6740

↑のサンプルコードのコメント見てたら

Is there a reason you have to copy the bitmap rather than just call SetResolution on the original?

なんで直接SetResolution呼ばないの?
ってあった。
たしかに

別に↑使わなくてもTexture2Dクラスだけでできそう。

var file = System.IO.File.ReadAllBytes(path);
var texture = new Texture2D(2, 2);
texture.LoadImage(file);
texture.Resize(destWidth, destHeight); // 変えたいサイズいれる
File.WriteAllBytes(path,texture.EncodeToPng());

pngだけだったらこれで

↑実行してみたら灰色になった。

https://mu-777.hatenablog.com/entry/2020/02/22/185225
こちらで修正できた
static Texture2D ResizeTexture(Texture2D srcTexture, int newWidth, int newHeight) {
    var resizedTexture = new Texture2D(newWidth, newHeight);
    Graphics.ConvertTexture(srcTexture, resizedTexture);
    return resizedTexture;
}

リサイズした画像をtexutre.EncodeToPng()してFile.WriteAllBytesしたら灰色画像が保存された。

GPU側に保存されているので、CPU側の処理では色の情報やらをもってこれないっぽい。
RenderTextureとGraphics.Blitを使えば描画されている情報をTexture2D側に書き込める。

https://answers.unity.com/questions/1470513/convert-texture-to-texture2d.html

無事に画像が保存できた

Firebase(Storage)にアップロードするのは後でやる_(:3 」∠ )_

ログインするとコメントできます