Pārlūkot izejas kodu

Read exif inside computer

Neeraj Gupta 2 gadi atpakaļ
vecāks
revīzija
20cfe2e93d
1 mainītis faili ar 17 papildinājumiem un 4 dzēšanām
  1. 17 4
      lib/utils/exif_util.dart

+ 17 - 4
lib/utils/exif_util.dart

@@ -1,5 +1,6 @@
 import 'dart:io' as io;
 import 'dart:io' as io;
 
 
+import "package:computer/computer.dart";
 import 'package:exif/exif.dart';
 import 'package:exif/exif.dart';
 import 'package:intl/intl.dart';
 import 'package:intl/intl.dart';
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
@@ -17,11 +18,11 @@ final _logger = Logger("ExifUtil");
 
 
 Future<Map<String, IfdTag>> getExif(File file) async {
 Future<Map<String, IfdTag>> getExif(File file) async {
   try {
   try {
-    final originFile = await getFile(file, isOrigin: true);
+    final io.File? originFile = await getFile(file, isOrigin: true);
     if (originFile == null) {
     if (originFile == null) {
       throw Exception("Failed to fetch origin file");
       throw Exception("Failed to fetch origin file");
     }
     }
-    final exif = await readExifFromFile(originFile);
+    final exif = await readExifAsync(originFile);
     if (!file.isRemoteFile && io.Platform.isIOS) {
     if (!file.isRemoteFile && io.Platform.isIOS) {
       await originFile.delete();
       await originFile.delete();
     }
     }
@@ -34,7 +35,7 @@ Future<Map<String, IfdTag>> getExif(File file) async {
 
 
 Future<Map<String, IfdTag>?> getExifFromSourceFile(io.File originFile) async {
 Future<Map<String, IfdTag>?> getExifFromSourceFile(io.File originFile) async {
   try {
   try {
-    final exif = await readExifFromFile(originFile);
+    final exif = await readExifAsync(originFile);
     return exif;
     return exif;
   } catch (e, s) {
   } catch (e, s) {
     _logger.severe("failed to get exif from origin file", e, s);
     _logger.severe("failed to get exif from origin file", e, s);
@@ -48,7 +49,7 @@ Future<DateTime?> getCreationTimeFromEXIF(
 ) async {
 ) async {
   try {
   try {
     assert(file != null || exifData != null);
     assert(file != null || exifData != null);
-    final exif = exifData ?? await readExifFromFile(file!);
+    final exif = exifData ?? await readExifAsync(file!);
     final exifTime = exif.containsKey(kDateTimeOriginal)
     final exifTime = exif.containsKey(kDateTimeOriginal)
         ? exif[kDateTimeOriginal]!.printable
         ? exif[kDateTimeOriginal]!.printable
         : exif.containsKey(kImageDateTime)
         : exif.containsKey(kImageDateTime)
@@ -72,6 +73,18 @@ Location? locationFromExif(Map<String, IfdTag> exif) {
   }
   }
 }
 }
 
 
+Future<Map<String, IfdTag>> _readExifArgs(Map<String, dynamic> args) {
+  return readExifFromFile(args["file"]);
+}
+
+Future<Map<String, IfdTag>> readExifAsync(io.File file) async {
+  return await Computer.shared().compute(
+    _readExifArgs,
+    param: {"file": file},
+    taskName: "readExifAsync",
+  );
+}
+
 GPSData _gpsDataFromExif(Map<String, IfdTag> exif) {
 GPSData _gpsDataFromExif(Map<String, IfdTag> exif) {
   final Map<String, dynamic> exifLocationData = {
   final Map<String, dynamic> exifLocationData = {
     "lat": null,
     "lat": null,