diff --git a/__tests__/exif.test.ts b/__tests__/exif.test.ts index ea770f9b..cceaeb64 100644 --- a/__tests__/exif.test.ts +++ b/__tests__/exif.test.ts @@ -1,6 +1,25 @@ -import { formatExposureCompensation, formatExposureTime } from '@/utility/exif'; +import { + convertApertureValueToFNumber, + formatExposureCompensation, + formatExposureTime, +} from '@/utility/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', () => { it('exposure time', () => { expect(formatExposureTime(0)).toBe(undefined); diff --git a/src/photo/form/index.ts b/src/photo/form/index.ts index fda60105..f6e1ddfd 100644 --- a/src/photo/form/index.ts +++ b/src/photo/form/index.ts @@ -6,7 +6,11 @@ import { generateLocalNaivePostgresString, generateLocalPostgresString, } from '@/utility/date'; -import { getAspectRatioFromExif, getOffsetFromExif } from '@/utility/exif'; +import { + convertApertureValueToFNumber, + getAspectRatioFromExif, + getOffsetFromExif, +} from '@/utility/exif'; import { roundToNumber } from '@/utility/number'; import { convertStringToArray } from '@/utility/string'; import { generateNanoid } from '@/utility/nanoid'; @@ -199,8 +203,11 @@ export const convertExifToFormData = ( focalLengthIn35MmFormat: data.tags?.FocalLengthIn35mmFormat?.toString(), lensMake: data.tags?.LensMake, lensModel: data.tags?.LensModel, - fNumber: data.tags?.FNumber?.toString(), - iso: data.tags?.ISO?.toString(), + fNumber: ( + data.tags?.FNumber?.toString() || + convertApertureValueToFNumber(data.tags?.ApertureValue) + ), + iso: data.tags?.ISO?.toString() || data.tags?.ISOSpeed?.toString(), exposureTime: data.tags?.ExposureTime?.toString(), exposureCompensation: data.tags?.ExposureCompensation?.toString(), latitude: diff --git a/src/utility/exif.ts b/src/utility/exif.ts index 8760cfe5..adeb3d65 100644 --- a/src/utility/exif.ts +++ b/src/utility/exif.ts @@ -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) => aperture ? `ƒ/${roundToString(aperture)}`