분류, 패키지 및 저장소 검색

패키지 상세v5.1.1

image_gallery_saver_plus

갤러리에 이미지를 저장하기 위한 플러터 플러그인입니다. iOS는 Info.plist 파일에 다음 키를 추가해야 합니다.

AndroidiOS
30일 다운로드
14.6만
좋아요
120
Pub 점수
160

패키지 설치

flutter pub add image_gallery_saver_plus

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

기기의 갤러리 또는 사진 라이브러리에 이미지를 저장할 수 있는 플러터 플러그인입니다. 안드로이드 및 iOS 플랫폼을 모두 지원하며, iOS에서는 정상적인 기능을 위해 Info.plist 파일에 특정 항목이 필요합니다. 메모리 또는 파일 경로에서 이미지 파일을 저장할 수 있는 간단한 API를 제공하여 이미지를 생성하거나 다운로드하는 앱에 적합합니다. 최신 안드로이드 및 iOS 개인정보 보호 요구 사항과 호환됩니다.

사용 사례

  • 카메라에서 캡처한 사진 저장
  • 생성된 이미지 내보내기
  • 앱에서 생성한 시각 정보 공유하기
  • 다운로드한 이미지 저장
  • 이미지 편집 도구와의 통합

주요 기능

  • 크로스 플랫폼 지원 (Android 및 iOS)
  • 간단한 저장 API
  • 파일 경로 및 바이트 데이터를 지원합니다
  • iOS Info.plist 구성이 필요합니다
  • 플랫폼 고유의 권한을 존중합니다

적합한 대상

  • 이미지 캡처 앱
  • 사진 편집 도구
  • 소셜 공유 기능
  • 동적 이미지 생성 기능을 갖춘 앱
  • 사용자 콘텐츠 내보내기 워크플로우

고려 사항

  • iOS에서 Info.plist 설정이 필요합니다
  • 안드로이드에서 런타임 권한이 필요합니다
  • 최신 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);
  }

카테고리

소스 저장소

이 패키지를 사용하는 프로젝트