Open12

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

sukedonsukedon

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

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

・after

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

sukedonsukedon

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

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

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

sukedonsukedon

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

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だけだったらこれで

sukedonsukedon

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

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;
}
sukedonsukedon

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

GPU側に保存されているので、CPU側の処理では色の情報やらをもってこれないっぽい。
RenderTextureとGraphics.Blitを使えば描画されている情報をTexture2D側に書き込める。
https://answers.unity.com/questions/1470513/convert-texture-to-texture2d.html

無事に画像が保存できた

sukedonsukedon

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

rarafyrarafy

|д゚) 後継のパッケージ使えばネイティブで圧縮できます!
https://github.com/rarafy/unimgpicker-plus
使い方はこんな感じ↓でサイズを指定してあげるとそのサイズに自動で縮小します。モバイルでのみ有効です。
imagePicker.Show("Select Image", "unimgpicker", 512);

sukedonsukedon

スクラップへの書き込みに気づいておりませんでした...!
使わせていただきます!🙌