搜索插件、代码仓与 APP 分类

插件详情v2.0.3

image_gallery_saver

一个用于将图像保存到相册的 Flutter 插件,iOS 需要将以下键添加到您的 Info.plist 文件中。

AndroidiOS
近 30 天下载
1.9万
喜欢数
885
Pub 分数
150

安装插件

flutter pub add image_gallery_saver

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

image_gallery_saver 包是一个 Flutter 插件,可在 Android 和 iOS 设备上将图像保存到设备相册。它提供了一个简单的 API,可将字节数据或文件路径作为图像存储到系统的照片库中。在 iOS 上,用户必须向 Info.plist 文件添加特定键以授予访问权限。该插件非常适合需要提供“保存到相册”功能的生成或下载图像的应用程序。它支持本地文件和原始图像数据,适用于各种用例。

适合场景

  • 保存捕获的屏幕截图
  • 存储生成的艺术作品
  • 导出用户创建的图像
  • 从应用内容中分享图片
  • 保存下载的媒体

主要特点

  • 简单保存 API
  • 支持 Android 和 iOS
  • 处理字节数据和文件路径
  • iOS 上需要 Info.plist 配置
  • 跨平台兼容性

适合对象

  • 图像编辑应用
  • 社交媒体分享工具
  • 照片生成工具
  • 用户生成内容的应用程序
  • 需要离线图像存储的工具

使用建议

  • iOS 需要 Info.plist 条目
  • 权限可能因平台而异
  • 大文件可能会影响性能
  • 有限的自定义选项
  • 无内置进度反馈

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

image_gallery_saver

Build Status pub package license

We use the image_picker plugin to select images from the Android and iOS image library, but it can't save images to the gallery. This plugin can provide this feature.

Usage

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

dependencies:
  image_gallery_saver: '^2.0.3'

iOS

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

  • NSPhotoLibraryAddUsageDescription - describe why your app needs permission for the photo library. This is called Privacy - Photo Library Additions Usage Description in the visual editor

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" .....>

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 ImageGallerySaver.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 ImageGallerySaver.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 ImageGallerySaver.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 ImageGallerySaver.saveFile(savePath);
    print(result);
  }

所属分类

源码仓库

使用此插件的项目