Revert "[mob] Two varients of CroppedFaceImageView for testing out which is more performant"

This reverts commit 7617817798d0f6888a9c0f9a620ba29069e4e7dd.
This commit is contained in:
ashilkn 2024-04-26 12:54:29 +05:30
parent a577611e65
commit 3eebfdd037
3 changed files with 47 additions and 77 deletions

View File

@ -288,7 +288,7 @@ class _FaceWidgetState extends State<FaceWidget> {
child: SizedBox( child: SizedBox(
width: 60, width: 60,
height: 60, height: 60,
child: CroppedFaceImgImageView( child: CroppedFaceImageView(
enteFile: widget.file, enteFile: widget.file,
face: widget.face, face: widget.face,
), ),

View File

@ -1,14 +1,15 @@
import "dart:io" show File; import "dart:io" show File;
import "dart:typed_data";
import 'dart:ui' as ui; import 'dart:ui' as ui;
import "package:computer/computer.dart";
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import "package:flutter/widgets.dart"; import "package:flutter/widgets.dart";
import "package:flutter_image_compress/flutter_image_compress.dart";
import "package:image/image.dart" as img;
import "package:logging/logging.dart"; import "package:logging/logging.dart";
import "package:photos/face/model/face.dart"; import "package:photos/face/model/face.dart";
import "package:photos/models/file/file.dart"; import "package:photos/models/file/file.dart";
import "package:photos/ui/viewer/file/thumbnail_widget.dart"; import "package:photos/ui/viewer/file/thumbnail_widget.dart";
import "package:photos/utils/face/face_util.dart";
import "package:photos/utils/file_util.dart"; import "package:photos/utils/file_util.dart";
import "package:photos/utils/image_util.dart"; import "package:photos/utils/image_util.dart";
@ -26,22 +27,23 @@ class CroppedFaceInfo {
}); });
} }
class CroppedFaceImgImageView extends StatefulWidget { class CroppedFaceImageView extends StatefulWidget {
final EnteFile enteFile; final EnteFile enteFile;
final Face face; final Face face;
const CroppedFaceImgImageView({ const CroppedFaceImageView({
Key? key, Key? key,
required this.enteFile, required this.enteFile,
required this.face, required this.face,
}) : super(key: key); }) : super(key: key);
@override @override
CroppedFaceImgImageViewState createState() => CroppedFaceImgImageViewState(); CroppedFaceImageViewState createState() => CroppedFaceImageViewState();
} }
class CroppedFaceImgImageViewState extends State<CroppedFaceImgImageView> { class CroppedFaceImageViewState extends State<CroppedFaceImageView> {
ui.Image? _image; ui.Image? _image;
final _computer = Computer.shared();
final _logger = Logger("CroppedFaceImageView"); final _logger = Logger("CroppedFaceImageView");
@override @override
@ -87,82 +89,50 @@ class CroppedFaceImgImageViewState extends State<CroppedFaceImgImageView> {
return null; return null;
} }
final image = await generateImgFaceThumbnails(ioFile.path, [faceBox]); img.Image? image = await _computer
.compute(decodeImage, param: {"filePath": ioFile.path});
return convertImageToFlutterUi(image.first); if (image == null) {
} catch (e, s) { _logger.info(
_logger.severe("Error getting image", e, s); "Failed to decode image ${widget.enteFile.title}. Compressing to jpg and decoding",
return null; );
} final compressedJPGImage =
} await FlutterImageCompress.compressWithFile(ioFile.path);
} image = await _computer.compute(
decodeJPGImage,
param: {"image": compressedJPGImage},
);
class CroppedFaceJpgImageView extends StatefulWidget { if (image == null) {
final EnteFile enteFile; throw Exception("Failed to decode image");
final Face face; }
const CroppedFaceJpgImageView({
Key? key,
required this.enteFile,
required this.face,
}) : super(key: key);
@override
CroppedFaceJpgImageViewState createState() => CroppedFaceJpgImageViewState();
}
class CroppedFaceJpgImageViewState extends State<CroppedFaceJpgImageView> {
Uint8List? _image;
final _logger = Logger("CroppedFaceImageView");
@override
void initState() {
super.initState();
_loadImage();
}
@override
void dispose() {
super.dispose();
}
Future<void> _loadImage() async {
final image = await getImage();
if (mounted) {
setState(() {
_image = image;
});
}
}
@override
Widget build(BuildContext context) {
return _image != null
? LayoutBuilder(
builder: (context, constraints) {
return Image.memory(
_image!,
);
},
)
: ThumbnailWidget(widget.enteFile);
}
Future<Uint8List?> getImage() async {
try {
final faceBox = widget.face.detection.box;
final File? ioFile = await getFile(widget.enteFile);
if (ioFile == null) {
return null;
} }
final image = await generateJpgFaceThumbnails(ioFile.path, [faceBox]); final stopwatch = Stopwatch()..start();
final croppedImage = img.copyCrop(
return image.first; image,
x: (image.width * faceBox.xMin).round(),
y: (image.height * faceBox.yMin).round(),
width: (image.width * faceBox.width).round(),
height: (image.height * faceBox.height).round(),
antialias: false,
);
_logger.info(
"Image crop took ${stopwatch.elapsedMilliseconds}ms ----------------",
);
stopwatch.stop();
return convertImageToFlutterUi(croppedImage);
} catch (e, s) { } catch (e, s) {
_logger.severe("Error getting image", e, s); _logger.severe("Error getting image", e, s);
return null; return null;
} }
} }
} }
Future<img.Image?> decodeImage(Map args) async {
return await img.decodeImageFile(args["filePath"]);
}
img.Image? decodeJPGImage(Map args) {
return img.decodeJpg(args["image"])!;
}

View File

@ -124,7 +124,7 @@ class PersonFaceWidget extends StatelessWidget {
return Stack( return Stack(
fit: StackFit.expand, fit: StackFit.expand,
children: [ children: [
CroppedFaceImgImageView(enteFile: file, face: face), CroppedFaceImageView(enteFile: file, face: face),
], ],
); );
} else { } else {