ente/mobile/lib/utils/face/face_box_crop.dart

57 lines
1.8 KiB
Dart

import "dart:io" show File;
import "package:flutter/foundation.dart";
import "package:photos/core/cache/lru_map.dart";
import "package:photos/face/model/box.dart";
import "package:photos/models/file/file.dart";
import "package:photos/models/file/file_type.dart";
// import "package:photos/utils/face/face_util.dart";
import "package:photos/utils/file_util.dart";
import "package:photos/utils/image_ml_isolate.dart";
import "package:photos/utils/thumbnail_util.dart";
import "package:pool/pool.dart";
final LRUMap<String, Uint8List?> faceCropCache = LRUMap(1000);
final LRUMap<String, Uint8List?> faceCropThumbnailCache = LRUMap(1000);
final poolFullFileFaceGenerations =
Pool(20, timeout: const Duration(seconds: 15));
final poolThumbnailFaceGenerations =
Pool(100, timeout: const Duration(seconds: 15));
Future<Map<String, Uint8List>?> getFaceCrops(
EnteFile file,
Map<String, FaceBox> faceBoxeMap, {
bool useFullFile = true,
}) async {
late String? imagePath;
if (useFullFile && file.fileType != FileType.video) {
final File? ioFile = await getFile(file);
if (ioFile == null) {
return null;
}
imagePath = ioFile.path;
} else {
final thumbnail = await getThumbnailForUploadedFile(file);
if (thumbnail == null) {
return null;
}
imagePath = thumbnail.path;
}
final List<String> faceIds = [];
final List<FaceBox> faceBoxes = [];
for (final e in faceBoxeMap.entries) {
faceIds.add(e.key);
faceBoxes.add(e.value);
}
final List<Uint8List> faceCrop =
await ImageMlIsolate.instance.generateFaceThumbnailsForImageUsingCanvas(
// await generateJpgFaceThumbnails(
imagePath,
faceBoxes,
);
final Map<String, Uint8List> result = {};
for (int i = 0; i < faceIds.length; i++) {
result[faceIds[i]] = faceCrop[i];
}
return result;
}