image_gallery_saver_plus

5.1.1

A Flutter plugin for saving images to the gallery. iOS needs to add the following keys to your Info.plist file.

Download archive

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);
  }
Changelog

Changelog

5.1.1

  • Updated the README dependency example to use version 5.1.0.

5.1.0

  • Added an optional creationDate parameter to saveImage and saveFile.
  • Added iOS support for preserving custom creation dates for saved images and videos.
  • Lowered the minimum supported versions to Dart 3.9.2 and Flutter 3.35.6.

5.0.0

  • Added Swift Package Manager (SPM) support for iOS alongside CocoaPods.
  • Raised minimum iOS support to 13.0.
  • Raised Flutter SDK support to 3.38.0+ and Dart SDK support to >=3.10.0.
  • Updated Android Gradle Plugin to 8.13.2 and Gradle wrapper to 8.14.5.
  • Applied the Kotlin Android plugin to the Android plugin module and example app for current AGP compatibility.
  • Updated Android media saving for scoped storage by using pending MediaStore entries on Android 10 and newer.
  • Added legacy write-storage permission support for Android 9 and older.
  • Removed obsolete Android manifest package declaration now that AGP uses the Gradle namespace.
  • Cleaned up Android plugin Kotlin code by removing unused imports, clamping JPEG quality, and cleaning up failed media writes.
  • Fixed the Android unit test to match the current plugin API.
  • Removed legacy fluttertoast dependency from the example app, replacing it with ScaffoldMessenger SnackBar alerts.
  • Fixed local file URL crash in saveImageAtFileUrl by using URL(fileURLWithPath:).
  • Fixed JSON result serialization bug in SaveResultModel.toDic().

4.0.1

  • Fix: Avoid Double Read Issue and Use copyTo() for Efficient File Copying

4.0.0

  • Support for the latest Gradle version.
  • Compatibility with the latest Flutter version.
  • Fixed issues related to deprecated Android APIs.
  • Resolved compiling errors due to unused and old Kotlin code.
  • Support for the latest Android Studio Ladybug with Flutter 3.29.*.

4.0.0-0.alpha

  • Support for the latest Gradle version.
  • Compatibility with the latest Flutter version.
  • Fixed issues related to deprecated Android APIs.
  • Resolved compiling errors due to unused and old Kotlin code.
  • Support for the latest Android Studio Ladybug with Flutter 3.24.5.

3.0.5

  • Stable Release: Marked as the stable release version.
  • iOS Issue Resolved: Fixed issues affecting the iOS platform.
  • Gradle Updated: Updated the Gradle configuration for better compatibility and performance.

3.0.4

  • Readme doc updated.

3.0.3

  • Fixed Ios Download Issue.

3.0.2

  • Compatible with the latest Flutter version.

3.0.1

  • Compatible with the latest Flutter version.

3.0.0

  • Compatible with the latest Flutter version.

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add image_gallery_saver_plus
pubspec.yaml
name: image_gallery_saver_plus
description: A Flutter plugin for saving images to the gallery. iOS needs to add the following keys to your Info.plist file.
version: 5.1.1
# publish_to: 'https://pub.dev'  # Publishes to pub.dev (default)
homepage: https://github.com/ArmanKT/image_gallery_saver_plus
repository: https://github.com/ArmanKT/image_gallery_saver_plus

environment:
  sdk: ">=3.9.2 <4.0.0"
  flutter: ">=3.35.6"

dependencies:
  flutter:
    sdk: flutter

flutter:
  plugin:
    platforms:
      android:
        package: com.example.image_gallery_saver_plus
        pluginClass: ImageGallerySaverPlusPlugin
      ios:
        pluginClass: ImageGallerySaverPlusPlugin

dev_dependencies:
  flutter_test:
    sdk: flutter

# Optional but recommended:
# Add a changelog file and update it with version history.
# A 'CHANGELOG.md' file is necessary for publishing.

Version history

VersionPublishedArchiveSHA-256
3.0.0On demandDownloade193eb4d…1fdb93
3.0.1On demandDownloadad39bc7f…c3a48e
3.0.2On demandDownload013f115f…e942b4
3.0.3On demandDownload2c1aea2d…5b7a8d
3.0.4On demandDownload3985c8f2…032bf4
3.0.5On demandDownload05a5dfd6…d76153
4.0.0-0.alphaOn demandDownload388b2043…659312
4.0.0On demandDownloadd56cb274…5c3d3a
4.0.1On demandDownload199b9e24…6950ad
5.0.0On demandDownload83135406…00f745
5.1.0On demandDownload73183ff4…69861d
5.1.1Cached · Upstream SHA-256 matchedDownload598beaaa…8bd34a

Dependencies

flutter { "sdk": "flutter" }