exif_util.dart 1.4 KB

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