diff --git a/lib/utils/ev_from_bytes.dart b/lib/utils/ev_from_bytes.dart index 553702d..9010402 100644 --- a/lib/utils/ev_from_bytes.dart +++ b/lib/utils/ev_from_bytes.dart @@ -4,24 +4,29 @@ import 'package:exif/exif.dart'; import 'package:flutter/foundation.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; +const String _isoExifKey = 'EXIF ISOSpeedRatings'; +const String _apertureExifKey = 'EXIF FNumber'; +const String _shutterSpeedExifKey = 'EXIF ExposureTime'; + Future evFromImage(Uint8List bytes) async { final tags = await readExifFromBytes(bytes); - final iso = double.tryParse("${tags["EXIF ISOSpeedRatings"]}"); - final apertureValueRatio = (tags["EXIF FNumber"]?.values as IfdRatios?)?.ratios.first; - final speedValueRatio = (tags["EXIF ExposureTime"]?.values as IfdRatios?)?.ratios.first; + final iso = double.tryParse("${tags[_isoExifKey]}"); + final apertureValueRatio = (tags[_apertureExifKey]?.values as IfdRatios?)?.ratios.first; + final speedValueRatio = (tags[_shutterSpeedExifKey]?.values as IfdRatios?)?.ratios.first; + if (iso == null || apertureValueRatio == null || speedValueRatio == null) { throw ArgumentError( - 'Error parsing EXIF: ${tags.keys.join(', ')}', + 'Error parsing EXIF', [ - if (iso == null) 'EXIF ISOSpeedRatings', - if (apertureValueRatio == null) 'EXIF FNumber', - if (speedValueRatio == null) 'EXIF ExposureTime', + if (iso == null) '$_isoExifKey: ${tags[_isoExifKey]?.printable} ${tags[_isoExifKey]?.printable.runtimeType}', + if (apertureValueRatio == null) '$_apertureExifKey: $apertureValueRatio', + if (speedValueRatio == null) '$_shutterSpeedExifKey: $speedValueRatio', ].join(', '), ); } - final aperture = apertureValueRatio.numerator / apertureValueRatio.denominator; - final speed = speedValueRatio.numerator / speedValueRatio.denominator; + final aperture = apertureValueRatio.toDouble(); + final speed = speedValueRatio.toDouble(); return log2(math.pow(aperture, 2)) - log2(speed) - log2(iso / 100); }