Single computer call for compression

This commit is contained in:
laurenspriem
2025-06-30 17:53:18 +02:00
parent 883b5b66e9
commit 00799c531a
2 changed files with 24 additions and 27 deletions

View File

@@ -46,14 +46,13 @@ class FaceThumbnailGenerator extends SuperIsolate {
'faceBoxesList': faceBoxesJson,
},
).then((value) => value.cast<Uint8List>());
final compressedFaces = <Future<Uint8List>>[];
for (final face in faces) {
final compressedFace = _computer.compute<Map, Uint8List>(
compressFaceThumbnail,
param: {'pngBytes': face},
);
compressedFaces.add(compressedFace);
}
return await Future.wait(compressedFaces);
final compressedFaces = await _computer.compute<Map, List<Uint8List>>(
compressFaceThumbnails,
param: {'listPngBytes': faces},
);
_logger.fine(
"Compressed face thumbnails from sizes ${faces.map((e) => e.length / 1024).toList()} to ${compressedFaces.map((e) => e.length / 1024).toList()} kilobytes",
);
return compressedFaces;
}
}

View File

@@ -543,30 +543,28 @@ Future<Uint8List> _cropAndEncodeCanvas(
return await _encodeImageToPng(croppedImage);
}
Future<Uint8List> compressFaceThumbnail(Map args) async {
final pngBytes = args['pngBytes'] as Uint8List;
Future<List<Uint8List>> compressFaceThumbnails(Map args) async {
final listPngBytes = args['listPngBytes'] as List<Uint8List>;
final List<Future<Uint8List>> compressedBytesList = [];
try {
final compressedBytes = await FlutterImageCompress.compressWithList(
pngBytes,
quality: _faceThumbnailCompressionQuality,
format: CompressFormat.jpeg,
minWidth: _faceThumbnailMinDimension,
minHeight: _faceThumbnailMinDimension,
);
_logger.info(
'Face thumbnail compressed from ${pngBytes.length} bytes to ${compressedBytes.length} bytes '
'(${((1 - compressedBytes.length / pngBytes.length) * 100).toStringAsFixed(1)}% reduction)',
);
return compressedBytes;
for (final pngBytes in listPngBytes) {
final compressedBytes = FlutterImageCompress.compressWithList(
pngBytes,
quality: _faceThumbnailCompressionQuality,
format: CompressFormat.jpeg,
minWidth: _faceThumbnailMinDimension,
minHeight: _faceThumbnailMinDimension,
);
compressedBytesList.add(compressedBytes);
}
return await Future.wait(compressedBytesList);
} catch (e, s) {
_logger.warning(
'Failed to compress face thumbnail, using original. Size: ${pngBytes.length} bytes',
'Failed to compress face thumbnail, using original. Size: ${listPngBytes.map((e) => e.length).toList()} bytes',
e,
s,
);
return pngBytes;
return listPngBytes;
}
}