mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-02 14:56:20 +01:00
86 lines
2.2 KiB
Dart
86 lines
2.2 KiB
Dart
|
import 'dart:convert';
|
||
|
|
||
|
import 'package:exifdart/exifdart.dart';
|
||
|
import 'package:intl/intl.dart';
|
||
|
|
||
|
class Exif {
|
||
|
Exif(this.data);
|
||
|
|
||
|
dynamic operator [](String key) => data[key];
|
||
|
|
||
|
bool containsKey(String key) => data.containsKey(key);
|
||
|
|
||
|
Map<String, dynamic> toJson() {
|
||
|
return data.map((key, value) {
|
||
|
var jsonValue;
|
||
|
if (key == "MakerNote") {
|
||
|
jsonValue = base64UrlEncode(value);
|
||
|
} else if (value is Rational) {
|
||
|
jsonValue = value.toJson();
|
||
|
} else if (value is List<Rational>) {
|
||
|
jsonValue = value.map((e) => e.toJson()).toList();
|
||
|
} else {
|
||
|
jsonValue = value;
|
||
|
}
|
||
|
return MapEntry(key, jsonValue);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
factory Exif.fromJson(Map<String, dynamic> json) {
|
||
|
return Exif(json.map((key, value) {
|
||
|
var exifValue;
|
||
|
if (key == "MakerNote") {
|
||
|
exifValue = base64Decode(value);
|
||
|
} else if (value is Map) {
|
||
|
exifValue = Rational.fromJson(value.cast<String, dynamic>());
|
||
|
} else if (value is List<Map>) {
|
||
|
exifValue = value
|
||
|
.map((e) => Rational.fromJson(e.cast<String, dynamic>()))
|
||
|
.toList();
|
||
|
} else {
|
||
|
exifValue = value;
|
||
|
}
|
||
|
return MapEntry(key, exifValue);
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
toString() {
|
||
|
final dataStr = data.entries.map((e) {
|
||
|
if (e.key == "MakerNote") {
|
||
|
return "${e.key}: '${base64UrlEncode(e.value)}'";
|
||
|
} else {
|
||
|
return "${e.key}: '${e.value}'";
|
||
|
}
|
||
|
}).join(", ");
|
||
|
return "$runtimeType {$dataStr}";
|
||
|
}
|
||
|
|
||
|
/// 0x010f Make
|
||
|
String get make => data["Make"];
|
||
|
|
||
|
/// 0x0110 Model
|
||
|
String get model => data["Model"];
|
||
|
|
||
|
/// 0x9003 DateTimeOriginal
|
||
|
DateTime get dateTimeOriginal => data.containsKey("DateTimeOriginal")
|
||
|
? dateTimeFormat.parse(data["DateTimeOriginal"])
|
||
|
: null;
|
||
|
|
||
|
/// 0x829a ExposureTime
|
||
|
Rational get exposureTime => data["ExposureTime"];
|
||
|
|
||
|
/// 0x829d FNumber
|
||
|
Rational get fNumber => data["FNumber"];
|
||
|
|
||
|
/// 0x8827 ISO/ISOSpeedRatings/PhotographicSensitivity
|
||
|
int get isoSpeedRatings => data["ISOSpeedRatings"];
|
||
|
|
||
|
/// 0x920a FocalLength
|
||
|
Rational get focalLength => data["FocalLength"];
|
||
|
|
||
|
static final dateTimeFormat = DateFormat("yyyy:MM:dd HH:mm:ss");
|
||
|
|
||
|
final Map<String, dynamic> data;
|
||
|
}
|