🌟

画像からGIFにするのクッソしんどかった【Flutter】

2023/03/29に公開

くっっっっっっっそしんどい。なんこれ。

複数枚の画像をGIFにするだけやのに
合計10時間くらいかかった。やば過ぎ。

ただ、結局はそこまで難しい事をしないって事に腹が立ってる。
でも解けて嬉しいって気持ちがある。

やり方

  1. camera または image_picker パッケージで XFile型 のデータを取得する
  2. Image パッケージのメソッドを使う。(終わり)
具体的なやり方
// ① camera から写真を撮影(パシャリ)
final xFile = await controller.takePicture();

// ② uint8List型にする
final bytes = await File(xFile.path).readAsBytes();

// ③ Image型にデコードする
final imglib.Image? image = imglib.decodeImage(bytes);

上記のノリで数枚の写真を撮影をして、
Image型のデータをどこかの変数に格納しておく。
僕の場合は images って変数を作っていたので、ここではそうする。

次に、Image型のデータをuint8List型に変更する。

え、②で一回変更してるやんって思うかもしれないけど、
後で使うから一旦今はスルーする。

// Image型からuint8List型に変更するだけでGIFになる
void convertImagesToGif() {
 // GifEncoderクラスをインスタンス化
 final imglib.Image animation = imglib.GifEncoder();
 
 // animationに画像を突っ込む
 for (imglib.Image image in images) {
   // 画像を追加する
   animation.addFrame(image);
 }
 
 // uint8List型のデータを取得
 final uint8list = animation.finish();
}

はい、あとはこの uint8List型を使って表示するだけ
表示の仕方は下記の通り

body: Image.memory(uint8List);

最終的には、uint8List型がGIFになっている不思議でした。
はい、意味わからん。なんこれ。なんでこうなんねん。

Firebase Storage に突っ込む場合の処理

final storageRef = FirebaseStorage.instance.ref().child('test/uid123');
final url = await storageRef
            .putData(uint8list!)
            .then((snapshot) => snapshot.ref.getDownloadURL());

uint8List型なので気をつけてね。

なにがウザいのか

Imageライブラリが結構直近でリファクタリングされてるっぽくて、
調べてもなかなか直近のImageライブラリを使ったやり方が出てこなかったこと。

全部データが古過ぎてうざかった。

特にこいつが最大級の混乱を生んだ↓
https://stackoverflow.com/questions/67160196/is-their-any-way-to-convert-jpeg-images-to-gif-in-flutter

でも、結局は上記でやってる処理はここで載っている事っていうね。

Imageライブラリが説明もなしにガラッと構成を変えてくるから
全く理解できんかった。

でも、コードのコメントでちゃんと書いてた(もちろん英語で)
もし無かったら死んでたわ。

Discussion