Flutter图片选择插件images_picker的使用

发布于 1周前 作者 songsunli 来自 Flutter

Flutter图片选择插件images_picker的使用

images_picker 是一个Flutter插件,允许您从Android和iOS的图库中选择图片/视频,或使用相机拍照/录像,并保存图片/视频到相册。该插件支持多选、裁剪、压缩等功能。

支持的功能

  • 从相册中选择多张图片/视频(微信风格)
  • 使用相机拍照/录像
  • 自定义裁剪比例
  • 图片压缩
  • 保存图片/视频到相册
  • 支持多种语言:系统默认、中文、繁体中文、英语、日语、法语、韩语、德语、越南语

安装配置

iOS配置

Info.plist文件中添加以下权限:

<key>NSCameraUsageDescription</key>
<string>Example usage description</string>
<key>NSMicrophoneUsageDescription</key>
<string>Example usage description</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Example usage description</string>

Android配置

AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

编辑android/app/build.gradle文件,确保minSdkVersion为21或更高版本:

minSdkVersion 21

pubspec.yaml文件中添加依赖:

dependencies:
  images_picker: ^newest

使用示例

下面是一个完整的Dart代码示例,展示了如何使用images_picker插件来实现图片选择、相机拍摄、保存网络图片/视频到相册等功能。

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:images_picker/images_picker.dart';
import 'package:dio/dio.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? path;

  Future<void> pickImages() async {
    List<Media>? res = await ImagesPicker.pick(
      count: 3,
      pickType: PickType.all, // 可以选择图片和视频
      language: Language.System, // 跟随系统语言
      maxTime: 30, // 视频最大时长
      cropOpt: CropOption(
        cropType: CropType.circle, // 圆形裁剪
      ),
    );
    if (res != null && res.isNotEmpty) {
      setState(() {
        path = res[0].thumbPath;
      });
    }
  }

  Future<void> openCamera() async {
    List<Media>? res = await ImagesPicker.openCamera(
      pickType: PickType.image, // 或者PickType.video
      quality: 0.8, // 图片质量
      maxSize: 800, // 最大大小
      maxTime: 15, // 录像最大时长
    );
    if (res != null && res.isNotEmpty) {
      setState(() {
        path = res[0].thumbPath;
      });
    }
  }

  Future<void> saveNetworkImageToAlbum() async {
    File file = await downloadFile('https://cdn.chavesgu.com/logo.png');
    bool res = await ImagesPicker.saveImageToAlbum(file, albumName: "chaves");
    print('Save network image result: $res');
  }

  Future<void> saveNetworkVideoToAlbum() async {
    File file = await downloadFile('https://cdn.chavesgu.com/SampleVideo.mp4');
    bool res = await ImagesPicker.saveVideoToAlbum(file, albumName: "chaves");
    print('Save network video result: $res');
  }

  Future<File> downloadFile(String url) async {
    Dio simple = Dio();
    String savePath = Directory.systemTemp.path + '/' + url.split('/').last;
    await simple.download(url, savePath,
        options: Options(responseType: ResponseType.bytes));
    print('Downloaded to: $savePath');
    return File(savePath);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            ElevatedButton(
              onPressed: pickImages,
              child: Text('选择图片'),
            ),
            ElevatedButton(
              onPressed: openCamera,
              child: Text('打开相机'),
            ),
            ElevatedButton(
              onPressed: saveNetworkImageToAlbum,
              child: Text('保存网络图片到相册'),
            ),
            ElevatedButton(
              onPressed: saveNetworkVideoToAlbum,
              child: Text('保存网络视频到相册'),
            ),
            path != null
                ? Container(
                    height: 200,
                    child: Image.file(
                      File(path!),
                      fit: BoxFit.contain,
                    ),
                  )
                : SizedBox.shrink(),
          ],
        ),
      ),
    );
  }
}

参数说明

以下是images_picker插件的所有参数:

选择图片/视频参数

  • count: 最大选择数量,默认为1。
  • pickType: 选择类型,可以是图片、视频或者全部。
  • gif: 是否支持GIF,默认为true
  • maxTime: 视频最大时长,默认为120秒。
  • cropOpt: 裁剪选项,默认为null
  • maxSize: 压缩后的最大大小(仅iOS支持),单位为KB。
  • quality: 图片质量(仅Android支持)。

打开相机参数

  • pickType: 拍摄类型,可以是图片或视频。
  • maxTime: 录像最大时长,默认为15秒。
  • cropOpt: 裁剪选项,默认为null
  • maxSize: 压缩后的最大大小(仅iOS支持),单位为KB。
  • quality: 图片质量(仅Android支持)。

通过以上内容,您可以轻松地在Flutter项目中集成并使用images_picker插件。如果您有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter图片选择插件images_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片选择插件images_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 images_picker 插件在 Flutter 中实现图片选择的代码示例。

首先,确保你已经在 pubspec.yaml 文件中添加了 images_picker 依赖:

dependencies:
  flutter:
    sdk: flutter
  images_picker: ^latest_version  # 请替换为最新的版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 images_picker 插件。以下是一个完整的示例,展示了如何选择图片并在页面上显示它们:

import 'package:flutter/material.dart';
import 'package:images_picker/images_picker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Image Picker Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ImagePickerScreen(),
    );
  }
}

class ImagePickerScreen extends StatefulWidget {
  @override
  _ImagePickerScreenState createState() => _ImagePickerScreenState();
}

class _ImagePickerScreenState extends State<ImagePickerScreen> {
  List<PickedFile> _pickedFiles = [];

  Future<void> _pickImages() async {
    final List<PickedFile> result = await ImagePicker().pickMultiImage(
      maxImages: 5,  // 最多可以选择的图片数量
      enableCamera: true,  // 是否启用相机
    );

    if (!mounted) return;

    setState(() {
      _pickedFiles = result ?? [];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickImages,
              child: Text('Pick Images'),
            ),
            SizedBox(height: 16.0),
            Expanded(
              child: GridView.builder(
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 3,
                  crossAxisSpacing: 4.0,
                  mainAxisSpacing: 4.0,
                ),
                itemCount: _pickedFiles.length,
                itemBuilder: (context, index) {
                  return Image.file(
                    File(_pickedFiles[index].path),
                    fit: BoxFit.cover,
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先导入了必要的包。
  2. 创建了一个 MyApp 小部件作为应用的根。
  3. ImagePickerScreen 中,我们定义了一个 _pickedFiles 列表来存储选择的图片。
  4. 使用 ImagePicker().pickMultiImage 方法来选择多张图片。这个方法返回一个 List<PickedFile>,其中包含了用户选择的图片文件。
  5. 使用 GridView.builder 来显示选择的图片。

请确保在实际项目中处理文件路径和图片加载时考虑到性能和内存管理,特别是在处理大量图片时。此外,images_picker 插件可能会随着版本的更新而有所变化,请参考其官方文档以获取最新的使用方法和最佳实践。

回到顶部