🌟
画像からGIFにするのクッソしんどかった【Flutter】
くっっっっっっっそしんどい。なんこれ。
複数枚の画像をGIFにするだけやのに
合計10時間くらいかかった。やば過ぎ。
ただ、結局はそこまで難しい事をしないって事に腹が立ってる。
でも解けて嬉しいって気持ちがある。
やり方
- camera または image_picker パッケージで XFile型 のデータを取得する
- 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ライブラリを使ったやり方が出てこなかったこと。
全部データが古過ぎてうざかった。
特にこいつが最大級の混乱を生んだ↓
でも、結局は上記でやってる処理はここで載っている事っていうね。
Imageライブラリが説明もなしにガラッと構成を変えてくるから
全く理解できんかった。
でも、コードのコメントでちゃんと書いてた(もちろん英語で)
もし無かったら死んでたわ。
Discussion