38 lines
1.1 KiB
Dart
38 lines
1.1 KiB
Dart
import 'dart:io';
|
||
|
||
import 'package:image/image.dart' as img;
|
||
import 'package:path_provider/path_provider.dart';
|
||
|
||
/// 上传前压缩:限制长边、JPEG 质量,减轻内存与带宽;解码失败时返回原文件。
|
||
Future<File> compressImageForUpload(
|
||
File source, {
|
||
int maxSide = 2048,
|
||
int jpegQuality = 85,
|
||
}) async {
|
||
try {
|
||
final raw = await source.readAsBytes();
|
||
final image = img.decodeImage(raw);
|
||
if (image == null) return source;
|
||
|
||
var work = image;
|
||
if (work.width > maxSide || work.height > maxSide) {
|
||
if (work.width >= work.height) {
|
||
work = img.copyResize(work, width: maxSide, interpolation: img.Interpolation.linear);
|
||
} else {
|
||
work = img.copyResize(work, height: maxSide, interpolation: img.Interpolation.linear);
|
||
}
|
||
}
|
||
|
||
final jpg = img.encodeJpg(work, quality: jpegQuality);
|
||
|
||
final dir = await getTemporaryDirectory();
|
||
final out = File(
|
||
'${dir.path}/upload_${DateTime.now().millisecondsSinceEpoch}.jpg',
|
||
);
|
||
await out.writeAsBytes(jpg, flush: true);
|
||
return out;
|
||
} catch (_) {
|
||
return source;
|
||
}
|
||
}
|