Flutter で画像をアルバムに保存したい時に便利な【image_gallery_saver】パッケージの使い方について解説します。
※アルバムやカメラからの画像の読み込みは以下の記事を参考にしてください。
image_gallery_saverの使い方
【iOS】Info.plistにキーを追加
Info.plist に以下のキーを追加します。
<key>NSPhotoLibraryAddUsageDescription</key>
<string>ライブラリに保存するよ</string>
パッケージの追加とインポート
pubspec.yaml にパッケージを追加してpub getします。
dependencies:
flutter:
sdk: flutter
# ↓これを追加
image_gallery_saver: ^1.5.0
dartのコードで以下をインポートします。
// ↓これをインポート
import 'package:image_gallery_saver/image_gallery_saver.dart';
// File や Uint8List も使用するのでこれもインポートします
import 'dart:io'; // File
import 'dart:typed_data'; // Uint8List
アルバムに保存
Uint8List を ImageGallerySaver.saveImage() に渡せばアルバムに画像を保存できます。
// 画像データの配列を取得
Uint8List _buffer = await _image.readAsBytes();
// アルバムに保存
final result = await ImageGallerySaver.saveImage(_buffer);
※上の例では image_pickerで読み込んだ File _image から Uint8List を取得しています。
サンプルコード
image_pickerでアルバムから画像を読み込み、image_gallery_saverでその画像をそのままアルバムに保存するサンプルコードです。
FloatingActionButtonでピッカーが起動し、画像を読み込んだ後で[Save]ボタンを押すと、アルバムに画像が保存されます。

import 'package:flutter/material.dart';
// image_picker
import 'package:image_picker/image_picker.dart';
// image_gallery_saver
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'dart:io'; //File
import 'dart:typed_data'; // Uint8List
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'image_gallery_saver'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
File _image;
final picker = ImagePicker();
// 画像の読み込み
Future _getImage() async {
//final pickedFile = await picker.getImage(source: ImageSource.camera);//カメラ
final pickedFile = await picker.getImage(source: ImageSource.gallery);//アルバム
if(pickedFile != null) {
setState((){
_image = File(pickedFile.path);
});
}
}
// 画像の保存
Future _saveImage() async {
if(_image != null) {
Uint8List _buffer = await _image.readAsBytes();
final result = await ImageGallerySaver.saveImage(_buffer);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
_image == null
? Text('No image selected.')
: Image.file(_image),
RaisedButton(
child: Text('Save'),
onPressed: _saveImage,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _getImage,
tooltip: 'Pick',
child: Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
以下の記事を参考に image_picker がセットアップされた状態でお試しください。
コメント