exif_util.dart 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. final exif = await readExifFromFile(originFile);
  16. if (!file.isRemoteFile() && io.Platform.isIOS) {
  17. await originFile.delete();
  18. }
  19. return exif;
  20. } catch (e) {
  21. _logger.severe("failed to getExif", e);
  22. rethrow;
  23. }
  24. }
  25. Future<DateTime> getCreationTimeFromEXIF(io.File file) async {
  26. final exif = await readExifFromFile(file);
  27. if (exif != null) {
  28. final exifTime = exif.containsKey(kDateTimeOriginal)
  29. ? exif[kDateTimeOriginal].printable
  30. : exif.containsKey(kImageDateTime)
  31. ? exif[kImageDateTime].printable
  32. : null;
  33. if (exifTime != null && exifTime != kEmptyExifDateTime) {
  34. try {
  35. return DateFormat(kExifDateTimePattern).parse(exifTime);
  36. } catch (e) {
  37. return null;
  38. }
  39. }
  40. }
  41. return null;
  42. }