feat(app): 创建图片选择+压缩处理器 — ImagePickerHandler
This commit is contained in:
67
app/lib/features/editor/widgets/image_picker_handler.dart
Normal file
67
app/lib/features/editor/widgets/image_picker_handler.dart
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
// 图片选择 + 压缩 + 缩略图生成工具类
|
||||||
|
//
|
||||||
|
// 职责:
|
||||||
|
// - 从相机/相册选择图片
|
||||||
|
// - 压缩到合理尺寸(≤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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user