搜尋分類、套件與程式碼儲存庫

套件詳情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);
  }

所屬分類

原始碼儲存庫

使用此套件的專案