📷

Androidでimage_gallery_saverパッケージを使用した写真保存で左90度回転した状態で保存される問題の解決方法

2024/02/11に公開

事象

Androidでimage_pickerパッケージを使用した写真撮影を行い、image_gallery_serverパッケージで写真を保存させた時に、端末内のギャラリー内で画像が左90度回転して保存されました。
iOSは問題なし。
ギャラリーで見た時は、以下のような感じです。。
せっかくのライジングフリーダムガンダムが、、

事象確認機種

  • Androidバージョン:13
  • 製品名:Galaxy A22 5G

使用パッケージ等のバージョン

  • Flutter: 3.16.8
  • image_picker: ^1.0.4
  • image_gallery_saver: ^2.0.3
  • image: ^4.1.3

https://pub.dev/packages/image_picker

https://pub.dev/packages/image_gallery_saver

https://pub.dev/packages/image

解決法

imageパッケージのcopyRotateメソッドを使用して、「回転されていない」状態の新しい画像データを生成し、その画像データを保存させるようにしました。

Sample.dart
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;
import 'package:image_gallery_saver/image_gallery_saver.dart';

class ImageService {
  const ImageService();

  Future<img.Image?> decodeImageFile(File imageFile) async {
    return await img.decodeImageFile(imageFile.path);
  }

  /// 画像を端末のアルバム内に保存する。
  Future<void> saveToLocal(File imageFile) async {
    if (Platform.isAndroid) {
      final decodedImage = await decodeImageFile(imageFile);
      if (decodedImage == null) {
        return;
      }

      // 左90度回転し保存されるため、保存前に回転していない状態の画像データの生成を行う。
      final rotatedImage = img.copyRotate(decodedImage, angle: 0);
      final newImageFile = await imageFile.writeAsBytes(
        img.encodeJpg(rotatedImage, quality: 50),
      );
      await saveImageFromByte(newImageFile);
      return;
    }

    await saveImageFromByte(imageFile);
  }

  /// 画像データから画像を端末のアルバム内に保存する。
  Future<void> saveImageFromByte(File imageFile) async {
    final result = await ImageGallerySaver.saveImage(
      imageFile.readAsBytesSync(),
    );
    debugPrint('Save result: $result');
  }
}

修正後は以下のように保存されます。
作り途中だけどフリーダムかっけぇ、、

備忘録

Androidでの他の端末がどう動くかわからないので気になる所!

Discussion