カテゴリー・パッケージ・リポジトリを検索

パッケージ詳細v5.1.1

image_gallery_saver_plus

ギャラリーに画像を保存するためのFlutterプラグインです。iOSでは、Info.plistファイルに次のキーを追加する必要があります。

AndroidiOS
30日間ダウンロード
14.6万
いいね数
120
Pub ポイント
160

パッケージをインストール

flutter pub add image_gallery_saver_plus

パッケージ概要

公開情報に基づく選定ガイドです。参考としてご利用ください。

デバイスのギャラリーまたはフォトライブラリに画像を保存できるFlutterプラグインです。AndroidおよびiOSプラットフォームをサポートしており、iOSでは正しく動作させるためにInfo.plistファイルに特定のエントリが必要です。メモリまたはファイルパスから画像ファイルを保存するためのシンプルなAPIを提供し、画像を生成またはダウンロードするアプリに最適です。最新のAndroidおよびiOSのプライバシー要件に対応しています。

用途

  • カメラからキャプチャした写真を保存する
  • 生成された画像のエクスポート
  • アプリが生成したビジュアルを共有する
  • ダウンロードした画像を保存する
  • 画像編集ツールとの統合

主な機能

  • クロスプラットフォーム対応(Android および iOS)
  • シンプルな保存 API
  • ファイルパスとバイトデータをサポートしています
  • iOS Info.plist の設定が必要です
  • プラットフォーム固有の権限を尊重します

適している対象

  • 画像キャプチャアプリ
  • 写真編集ツール
  • ソーシャル共有機能
  • 動的画像生成を備えたアプリ
  • ユーザー コンテンツ エクスポート ワークフロー

注意事項

  • iOSでInfo.plistの設定が必要です
  • Androidで実行時権限が必要です
  • 新しいOSバージョンではユーザーの承認が必要になる場合があります
  • プラットフォームでサポートされている画像形式に限定されます
  • 組み込みの進行状況またはエラー通知なし

元の README

関連するソースリポジトリの README 原文のスナップショットです。最新の内容はリポジトリをご覧ください。

image_gallery_saver_plus

pub package license

An updated plugin enables users to download and save images and videos directly to their gallery, with enhanced performance, improved media organization features, and better compatibility across various devices.

Usage

To use this plugin, add image_gallery_saver_plus as a dependency in your pubspec.yaml file. For example:

dependencies:
  image_gallery_saver_plus: ^5.1.1

iOS

Your project need create with swift. Add the following keys to your Info.plist file, located in /ios/Runner/Info.plist:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need permission to save photos and videos to your library for your convenience.</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>We need permission to access your photo library to view and select your photos and videos.</string>

Android

You need to ask for storage permission to save an image to the gallery. You can handle the storage permission using flutter_permission_handler. In Android version 10, Open the manifest file and add this line to your application tag

<application android:requestLegacyExternalStorage="true" .....>

API

ImageGallerySaverPlus.saveImage(...)

Save raw image bytes to the gallery.

Parameter Type Default Description
imageBytes Uint8List required The image bytes to save.
quality int 80 JPEG compression quality (0–100).
name String? null Optional file name.
isReturnImagePathOfIOS bool false Return the saved file path on iOS.
creationDate DateTime? null iOS only. Sets the asset's creation date shown in Photos. See below.
ImageGallerySaverPlus.saveFile(...)

Save a PNG/JPG/JPEG image or a video file to the gallery.

Parameter Type Default Description
file String required Path to the local file to save.
name String? null Optional file name.
isReturnPathOfIOS bool false Return the saved file path on iOS.
creationDate DateTime? null iOS only. Sets the asset's creation date shown in Photos (works for both images and videos). See below.

Setting the creation date (iOS)

By default the gallery stamps saved media with the current date/time. Pass a creationDate to control the date that Photos displays for the asset — useful when re-saving media that was originally captured at an earlier time (e.g. downloaded backups, imported memories).

final result = await ImageGallerySaverPlus.saveImage(
  imageBytes,
  quality: 80,
  name: "my_photo",
  creationDate: DateTime(2020, 1, 1),
);
final result = await ImageGallerySaverPlus.saveFile(
  savePath,
  creationDate: DateTime.parse("2020-01-01T10:30:00"),
);

Notes:

  • iOS only. On iOS, providing a creationDate imports the asset through PHPhotoLibrary so the date is honored. When it is null, the legacy save path is used and the asset gets the current date.
  • On Android the parameter is accepted but currently ignored; the asset keeps the date it is saved.

Example

Saving an image from the internet, quality and name is option

  _saveLocalImage() async {
    RenderRepaintBoundary boundary =
        _globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
    ui.Image image = await boundary.toImage();
    ByteData? byteData =
        await (image.toByteData(format: ui.ImageByteFormat.png));
    if (byteData != null) {
      final result =
          await ImageGallerySaverPlus.saveImage(byteData.buffer.asUint8List());
      print(result);
    }
  }
  
  _saveNetworkImage() async {
    var response = await Dio().get(
        "https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/sign=a62e824376d98d1069d40a31113eb807/838ba61ea8d3fd1fc9c7b6853a4e251f94ca5f46.jpg",
        options: Options(responseType: ResponseType.bytes));
    final result = await ImageGallerySaverPlus.saveImage(
        Uint8List.fromList(response.data),
        quality: 60,
        name: "hello");
    print(result);
  }

Saving file(ig: video/gif/others) from the internet

  _saveNetworkGifFile() async {
    var appDocDir = await getTemporaryDirectory();
    String savePath = appDocDir.path + "/temp.gif";
    String fileUrl =
        "https://hyjdoc.oss-cn-beijing.aliyuncs.com/hyj-doc-flutter-demo-run.gif";
    await Dio().download(fileUrl, savePath);
    final result =
        await ImageGallerySaverPlus.saveFile(savePath, isReturnPathOfIOS: true);
    print(result);
  }

  _saveNetworkVideoFile() async {
    var appDocDir = await getTemporaryDirectory();
    String savePath = appDocDir.path + "/temp.mp4";
    String fileUrl =
        "https://s3.cn-north-1.amazonaws.com.cn/mtab.kezaihui.com/video/ForBiggerBlazes.mp4";
    await Dio().download(fileUrl, savePath, onReceiveProgress: (count, total) {
      print((count / total * 100).toStringAsFixed(0) + "%");
    });
    final result = await ImageGallerySaverPlus.saveFile(savePath);
    print(result);
  }

カテゴリー

ソースリポジトリ

このパッケージを使用しているプロジェクト