搜索分类、插件与代码仓

插件详情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 运行时权限
  • 在较新的操作系统版本上可能需要用户同意
  • 仅限平台支持的图像格式
  • 无内置进度或错误反馈

原始 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);
  }

所属分类

源码仓库

使用此插件的项目