From 00799c531ae50785420eb3f3f2a17deea4e776df Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Mon, 30 Jun 2025 17:53:18 +0200 Subject: [PATCH] Single computer call for compression --- .../face_thumbnail_generator.dart | 17 +++++----- mobile/lib/utils/image_ml_util.dart | 34 +++++++++---------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/mobile/lib/services/machine_learning/face_thumbnail_generator.dart b/mobile/lib/services/machine_learning/face_thumbnail_generator.dart index 414492b2de..fb77f35990 100644 --- a/mobile/lib/services/machine_learning/face_thumbnail_generator.dart +++ b/mobile/lib/services/machine_learning/face_thumbnail_generator.dart @@ -46,14 +46,13 @@ class FaceThumbnailGenerator extends SuperIsolate { 'faceBoxesList': faceBoxesJson, }, ).then((value) => value.cast()); - final compressedFaces = >[]; - for (final face in faces) { - final compressedFace = _computer.compute( - compressFaceThumbnail, - param: {'pngBytes': face}, - ); - compressedFaces.add(compressedFace); - } - return await Future.wait(compressedFaces); + final compressedFaces = await _computer.compute>( + 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; } } diff --git a/mobile/lib/utils/image_ml_util.dart b/mobile/lib/utils/image_ml_util.dart index 2ea25cbfbd..0ccb5cd815 100644 --- a/mobile/lib/utils/image_ml_util.dart +++ b/mobile/lib/utils/image_ml_util.dart @@ -543,30 +543,28 @@ Future _cropAndEncodeCanvas( return await _encodeImageToPng(croppedImage); } -Future compressFaceThumbnail(Map args) async { - final pngBytes = args['pngBytes'] as Uint8List; +Future> compressFaceThumbnails(Map args) async { + final listPngBytes = args['listPngBytes'] as List; + final List> 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; } }