68 lines
1.9 KiB
Dart
68 lines
1.9 KiB
Dart
// 图片选择 + 压缩 + 缩略图生成工具类
|
||
//
|
||
// 职责:
|
||
// - 从相机/相册选择图片
|
||
// - 压缩到合理尺寸(≤1024px, 质量 85)
|
||
// - 生成缩略图(≤200px, 质量 70)
|
||
|
||
import 'package:flutter_image_compress/flutter_image_compress.dart';
|
||
import 'package:image_picker/image_picker.dart';
|
||
import 'package:path_provider/path_provider.dart';
|
||
import 'package:uuid/uuid.dart';
|
||
|
||
/// 图片选择 + 压缩 + 缩略图生成
|
||
class ImagePickerHandler {
|
||
static const _uuid = Uuid();
|
||
|
||
/// 从相机或相册选择图片
|
||
/// 返回压缩后的本地文件路径,取消返回 null
|
||
static Future<String?> pickImage({required bool fromCamera}) async {
|
||
final picker = ImagePicker();
|
||
final xFile = await picker.pickImage(
|
||
source: fromCamera ? ImageSource.camera : ImageSource.gallery,
|
||
maxWidth: 1024,
|
||
maxHeight: 1024,
|
||
imageQuality: 85,
|
||
);
|
||
if (xFile == null) return null;
|
||
|
||
// 压缩图片
|
||
final compressedPath = await _compressImage(xFile.path);
|
||
return compressedPath;
|
||
}
|
||
|
||
/// 生成缩略图路径
|
||
static Future<String> generateThumbnail(String imagePath) async {
|
||
final dir = await getApplicationDocumentsDirectory();
|
||
final thumbName = 'thumb_${_uuid.v4()}.jpg';
|
||
final thumbPath = '${dir.path}/$thumbName';
|
||
|
||
final result = await FlutterImageCompress.compressAndGetFile(
|
||
imagePath,
|
||
thumbPath,
|
||
minHeight: 200,
|
||
minWidth: 200,
|
||
quality: 70,
|
||
);
|
||
|
||
return result?.path ?? imagePath;
|
||
}
|
||
|
||
/// 压缩原图
|
||
static Future<String> _compressImage(String path) async {
|
||
final dir = await getApplicationDocumentsDirectory();
|
||
final fileName = 'img_${_uuid.v4()}.jpg';
|
||
final targetPath = '${dir.path}/$fileName';
|
||
|
||
final result = await FlutterImageCompress.compressAndGetFile(
|
||
path,
|
||
targetPath,
|
||
quality: 85,
|
||
minWidth: 1024,
|
||
minHeight: 1024,
|
||
);
|
||
|
||
return result?.path ?? path;
|
||
}
|
||
}
|