Flutter图片选择插件hl_image_picker的使用

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

Flutter图片选择插件hl_image_picker的使用

hl_image_picker 是一个用于Flutter应用的媒体选择插件,它简化了从相册中选择媒体(如图片和视频)、裁剪图片以及拍摄新照片或录制视频的功能。以下是关于该插件的详细介绍、安装指南、配置步骤及使用方法。

插件特性

  • 从相册中选择图片/视频
  • 拍摄照片或录制视频
  • 打开图片裁剪器
  • 支持多图裁剪
  • 支持所选图片的质量压缩
  • 支持GIF文件的选择

平台支持

平台 版本要求
Android SDK 21+
iOS 11.0+

安装

在命令行中执行以下命令来添加依赖:

$ flutter pub add hl_image_picker

注意:如果你的应用仅针对Android或iOS开发,则可以直接选择对应的平台特定包:

配置

iOS

你需要为iOS项目做如下配置:

  1. ios/Runner/Info.plist文件中添加隐私描述信息:

    <key>NSPhotoLibraryUsageDescription</key>
    <string>此应用程序需要访问照片库</string>
    
    <key>NSCameraUsageDescription</key>
    <string>此应用程序需要访问相机</string>
    
    <!-- 如果你的插件需要录制视频并访问设备麦克风,请包含以下描述 -->
    <key>NSMicrophoneUsageDescription</key>
    <string>此应用程序需要访问麦克风</string>
    
  2. 对于iOS 14及以上版本,可以通过设置PHPhotoLibraryPreventAutomaticLimitedAccessAlert来阻止系统自动弹出有限访问提示框:

    <key>PHPhotoLibraryPreventAutomaticLimitedAccessAlert</key>
    <true/>
    
  3. (可选) 如果你想自定义相机界面的语言,可以在Xcode中打开项目,转到Info选项卡,并添加缺失的语言本地化。

Android

对于Android项目,确保你做了以下配置:

  1. 设置minSdkVersion至少为21:

    android {
        ...
        defaultConfig {
            minSdkVersion 21
            ...
        }
    }
    
  2. AndroidManifest.xml文件中添加权限声明:

    <!-- Android 12及以下 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
    <!-- 目标API级别为Android 13及以上 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
    
    <!-- 请求相机权限 -->
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <uses-permission android:name="android.permission.CAMERA" />
    
    <!-- 如果你需要录制视频 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

使用示例

下面是一个完整的Dart代码示例,展示了如何使用hl_image_picker插件进行图片选择、拍照以及裁剪操作。

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Image Picker Demo',
      home: MyHomePage(title: 'Image Picker Example'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, this.title});

  final String? title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _picker = HLImagePicker();

  List<HLPickerItem> _selectedImages = [];

  bool _isCroppingEnabled = false;
  int _count = 4;
  MediaType _type = MediaType.all;
  bool _isExportThumbnail = true;
  bool _enablePreview = false;
  bool _usedCameraButton = true;
  int _numberOfColumn = 3;
  bool _includePrevSelected = false;
  CropAspectRatio? _aspectRatio;
  List<CropAspectRatioPreset>? _aspectRatioPresets;
  double _compressQuality = 0.9;
  CroppingStyle _croppingStyle = CroppingStyle.normal;

  _openPicker() async {
    try {
      final images = await _picker.openPicker(
        cropping: _isCroppingEnabled,
        selectedIds: _includePrevSelected
            ? _selectedImages.map((e) => e.id).toList()
            : null,
        pickerOptions: HLPickerOptions(
          mediaType: _type,
          enablePreview: _enablePreview,
          isExportThumbnail: _isExportThumbnail,
          thumbnailCompressFormat: CompressFormat.jpg,
          thumbnailCompressQuality: 0.9,
          maxSelectedAssets: _count,
          usedCameraButton: _usedCameraButton,
          numberOfColumn: _numberOfColumn,
          isGif: true,
        ),
        cropOptions: HLCropOptions(
          aspectRatio: _aspectRatio,
          aspectRatioPresets: _aspectRatioPresets,
          compressQuality: _compressQuality,
          compressFormat: CompressFormat.jpg,
          croppingStyle: _croppingStyle,
        ),
      );
      setState(() {
        _selectedImages = images;
      });
    } catch (e) {
      debugPrint(e.toString());
    }
  }

  _openCamera() async {
    try {
      final image = await _picker.openCamera(
        cropping: _isCroppingEnabled,
        cameraOptions: HLCameraOptions(
          cameraType:
              _type == MediaType.video ? CameraType.video : CameraType.image,
          recordVideoMaxSecond: 40,
          isExportThumbnail: _isExportThumbnail,
          thumbnailCompressFormat: CompressFormat.jpg,
          thumbnailCompressQuality: 0.9,
        ),
        cropOptions: HLCropOptions(
          aspectRatio: _aspectRatio,
          aspectRatioPresets: _aspectRatioPresets,
          croppingStyle: _croppingStyle,
        ),
      );
      setState(() {
        _selectedImages = [image];
      });
    } catch (e) {
      debugPrint(e.toString());
    }
  }

  _openCropper() async {
    try {
      if (_selectedImages.isEmpty) {
        return;
      }
      final image = await _picker.openCropper(
        _selectedImages[0].path,
        cropOptions: HLCropOptions(
          aspectRatio: _aspectRatio,
          aspectRatioPresets: _aspectRatioPresets,
          compressQuality: _compressQuality,
          compressFormat: CompressFormat.jpg,
          croppingStyle: _croppingStyle,
        ),
      );
      setState(() {
        _selectedImages = [image];
      });
    } catch (e) {
      debugPrint(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(widget.title!),
        ),
        body: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 显示已选择的媒体项
              MediaPreview(items: _selectedImages),
              
              // 打开选择器按钮
              Align(
                child: ElevatedButton(
                  onPressed: _openPicker,
                  child: const Text('Open Picker'),
                ),
              ),
              
              // 打开相机按钮
              Align(
                child: ElevatedButton(
                  onPressed: _openCamera,
                  child: const Text('Open camera'),
                ),
              ),
              
              // 打开裁剪器按钮(如果有已选择的图片)
              Align(
                child: ElevatedButton(
                  onPressed: _selectedImages.isNotEmpty ? _openCropper : null,
                  child: const Text('Open cropper'),
                ),
              ),
              
              // 配置部分...
            ],
          ),
        ),
      ),
    );
  }
}

以上代码提供了一个基本框架,用户可以通过点击不同的按钮来触发相应的功能,如打开图片选择器、相机或裁剪工具。同时,它还包含了简单的UI元素用于展示已选择的媒体项。

请注意,为了使上述代码正常工作,你可能还需要实现一些辅助组件(如MediaPreview),并且根据自己的需求调整配置参数。希望这段代码能帮助你快速上手hl_image_picker插件!


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

1 回复

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


当然,下面是一个关于如何使用Flutter中的hl_image_picker插件来选择图片的示例代码。这个插件允许用户从设备图库或相机中选择图片。

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

dependencies:
  flutter:
    sdk: flutter
  hl_image_picker: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Dart文件中,你可以按照以下步骤使用hl_image_picker插件:

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

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

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

class ImagePickerDemo extends StatefulWidget {
  @override
  _ImagePickerDemoState createState() => _ImagePickerDemoState();
}

class _ImagePickerDemoState extends State<ImagePickerDemo> {
  File? _imageFile;

  Future<void> _pickImage() async {
    final result = await HlImagePicker.pickImage(
      maxImages: 1, // 最大选择图片数量
      enableCamera: true, // 是否启用相机
      imageQuality: 100, // 图片质量,范围0-100
      pickType: PickImageType.both, // 选择类型,可以是相册、相机或两者
    );

    if (result != null && result.isNotEmpty) {
      setState(() {
        _imageFile = File(result.first);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
            SizedBox(height: 20),
            if (_imageFile != null)
              Image.file(
                _imageFile!,
                width: 300,
                height: 300,
                fit: BoxFit.cover,
              )
            else
              Text('No image selected'),
          ],
        ),
      ),
    );
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml中添加hl_image_picker依赖。
  2. 导入包:在Dart文件中导入hl_image_picker包。
  3. UI构建
    • 使用MaterialAppScaffold构建基本的应用框架。
    • 使用ElevatedButton创建一个按钮,点击按钮时调用_pickImage函数。
    • 使用Image.file显示选中的图片,如果没有选中图片则显示文本“No image selected”。
  4. 图片选择
    • HlImagePicker.pickImage方法用于从相册或相机中选择图片。
    • maxImages:设置最大选择图片数量。
    • enableCamera:是否启用相机。
    • imageQuality:图片质量。
    • pickType:选择类型,可以是相册(PickImageType.photo)、相机(PickImageType.camera)或两者(PickImageType.both)。

这个示例展示了如何使用hl_image_picker插件在Flutter应用中实现图片选择功能。你可以根据实际需求进一步自定义和扩展这个示例。

回到顶部