exif_util.dart 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import 'dart:io' as io;
  2. import 'package:exif/exif.dart';
  3. import 'package:intl/intl.dart';
  4. import 'package:logging/logging.dart';
  5. import 'package:photos/models/file.dart';
  6. import 'package:photos/utils/file_util.dart';
  7. const kDateTimeOriginal = "EXIF DateTimeOriginal";
  8. const kImageDateTime = "Image DateTime";
  9. const kExifDateTimePattern = "yyyy:MM:dd HH:mm:ss";
  10. const kEmptyExifDateTime = "0000:00:00 00:00:00";
  11. final _logger = Logger("ExifUtil");
  12. Future<Map<String, IfdTag>> getExif(File file) async {
  13. try {
  14. final originFile = await getFile(file, isOrigin: true);
  15. if (originFile == null) {
  16. throw Exception("Failed to fetch origin file");
  17. }
  18. final exif = await readExifFromFile(originFile);
  19. if (!file.isRemoteFile && io.Platform.isIOS) {
  20. await originFile.delete();
  21. }
  22. return exif;
  23. } catch (e) {
  24. _logger.severe("failed to getExif", e);
  25. rethrow;
  26. }
  27. }
  28. Future<DateTime?> getCreationTimeFromEXIF(io.File file) async {
  29. try {
  30. final exif = await readExifFromFile(file);
  31. final exifTime = exif.containsKey(kDateTimeOriginal)
  32. ? exif[kDateTimeOriginal]!.printable
  33. : exif.containsKey(kImageDateTime)
  34. ? exif[kImageDateTime]!.printable
  35. : null;
  36. if (exifTime != null && exifTime != kEmptyExifDateTime) {
  37. return DateFormat(kExifDateTimePattern).parse(exifTime);
  38. }
  39. } catch (e) {
  40. _logger.severe("failed to getCreationTimeFromEXIF", e);
  41. }
  42. return null;
  43. }