Make EXIF parsing more compatible

This commit is contained in:
Sam Becker 2024-07-26 12:03:59 -05:00
parent 8d525820db
commit 4c092cef54
3 changed files with 60 additions and 4 deletions

View File

@ -1,6 +1,25 @@
import { formatExposureCompensation, formatExposureTime } from '@/utility/exif'; import {
convertApertureValueToFNumber,
formatExposureCompensation,
formatExposureTime,
} from '@/utility/exif';
describe('EXIF', () => { describe('EXIF', () => {
describe('converts', () => {
it('aperture value to f-number', () => {
expect(convertApertureValueToFNumber('0')).toBe('1');
expect(convertApertureValueToFNumber('1')).toBe('1.4');
expect(convertApertureValueToFNumber('2')).toBe('2');
expect(convertApertureValueToFNumber('3')).toBe('2.8');
expect(convertApertureValueToFNumber('4')).toBe('4');
expect(convertApertureValueToFNumber('5')).toBe('5.6');
expect(convertApertureValueToFNumber('6')).toBe('8');
expect(convertApertureValueToFNumber('7')).toBe('11');
expect(convertApertureValueToFNumber('8')).toBe('16');
expect(convertApertureValueToFNumber('9')).toBe('22');
expect(convertApertureValueToFNumber('10')).toBe('32');
});
});
describe('formats', () => { describe('formats', () => {
it('exposure time', () => { it('exposure time', () => {
expect(formatExposureTime(0)).toBe(undefined); expect(formatExposureTime(0)).toBe(undefined);

View File

@ -6,7 +6,11 @@ import {
generateLocalNaivePostgresString, generateLocalNaivePostgresString,
generateLocalPostgresString, generateLocalPostgresString,
} from '@/utility/date'; } from '@/utility/date';
import { getAspectRatioFromExif, getOffsetFromExif } from '@/utility/exif'; import {
convertApertureValueToFNumber,
getAspectRatioFromExif,
getOffsetFromExif,
} from '@/utility/exif';
import { roundToNumber } from '@/utility/number'; import { roundToNumber } from '@/utility/number';
import { convertStringToArray } from '@/utility/string'; import { convertStringToArray } from '@/utility/string';
import { generateNanoid } from '@/utility/nanoid'; import { generateNanoid } from '@/utility/nanoid';
@ -199,8 +203,11 @@ export const convertExifToFormData = (
focalLengthIn35MmFormat: data.tags?.FocalLengthIn35mmFormat?.toString(), focalLengthIn35MmFormat: data.tags?.FocalLengthIn35mmFormat?.toString(),
lensMake: data.tags?.LensMake, lensMake: data.tags?.LensMake,
lensModel: data.tags?.LensModel, lensModel: data.tags?.LensModel,
fNumber: data.tags?.FNumber?.toString(), fNumber: (
iso: data.tags?.ISO?.toString(), data.tags?.FNumber?.toString() ||
convertApertureValueToFNumber(data.tags?.ApertureValue)
),
iso: data.tags?.ISO?.toString() || data.tags?.ISOSpeed?.toString(),
exposureTime: data.tags?.ExposureTime?.toString(), exposureTime: data.tags?.ExposureTime?.toString(),
exposureCompensation: data.tags?.ExposureCompensation?.toString(), exposureCompensation: data.tags?.ExposureCompensation?.toString(),
latitude: latitude:

View File

@ -31,6 +31,36 @@ export const getAspectRatioFromExif = (data: ExifData): number => {
} }
}; };
export const convertApertureValueToFNumber = (
apertureValue?: string
): string | undefined => {
if (apertureValue) {
const aperture = parseInt(apertureValue);
if (aperture <= 10) {
switch (aperture) {
case 0: return '1';
case 1: return '1.4';
case 2: return '2';
case 3: return '2.8';
case 4: return '4';
case 5: return '5.6';
case 6: return '8';
case 7: return '11';
case 8: return '16';
case 9: return '22';
case 10: return '32';
}
} else {
const value = Math.round(Math.pow(2, aperture / 2.0) * 10) / 10;
return Number.isInteger(value)
? value.toFixed(0)
: value.toFixed(1);
}
} else {
return undefined;
}
};
export const formatAperture = (aperture?: number) => export const formatAperture = (aperture?: number) =>
aperture aperture
? `ƒ/${roundToString(aperture)}` ? `ƒ/${roundToString(aperture)}`