diff --git a/src/utility/fujifilm.ts b/src/utility/fujifilm.ts index e4be7ed4..f88f55c1 100644 --- a/src/utility/fujifilm.ts +++ b/src/utility/fujifilm.ts @@ -3,6 +3,8 @@ import type { ExifData } from 'ts-exif-parser'; +const MAKE_FUJIFILM = 'FUJIFILM'; + const BYTE_INDEX_FIRST_TAG = 14; const BYTES_PER_TAG = 12; const BYTE_OFFSET_FOR_INT_VALUE = 8; @@ -12,34 +14,38 @@ const TAG_ID_FILM_MODE = 0x1401; type FujifilmSimulationFromSaturation = 'Monochrome' | - 'Monochrome + Ye Filter' | - 'Monochrome + R Filter' | - 'Monochrome + G Filter' | + 'Monochrome + Ye' | + 'Monochrome + R' | + 'Monochrome + G' | 'Sepia' | - 'ACROS' | - 'ACROS + Ye Filter' | - 'ACROS + R Filter' | - 'ACROS + G Filter'; + 'Acros' | + 'Acros + Ye' | + 'Acros + R' | + 'Acros + G'; type FujifilmMode = - 'Provia / Standard' | - 'ASTIA / Soft' | - 'Velvia / Vivid' | + 'Provia' | + 'Portrait' | + 'Portrait Saturation' | + 'Portrait Skin Tone' | + 'Portrait Sharpness' | + 'Portrait Ex' | + 'Velvia' | 'Pro Neg. Std' | 'Pro Neg. Hi' | 'Classic Chrome' | - 'ETERNA / Cinema' | + 'Eterna' | 'Classic Neg.' | - 'ETERNA Bleach Bypass' | + 'Eterna Bleach Bypass' | 'Nostalgic Neg.' | - 'REALA ACE'; + 'Reala'; export type FujifilmSimulation = FujifilmSimulationFromSaturation | FujifilmMode; export const isExifForFujifilm = (data: ExifData) => - data.tags?.Make === 'FUJIFILM'; + data.tags?.Make === MAKE_FUJIFILM; const parseFujifilmMakerNote = ( bytes: Buffer, @@ -61,14 +67,14 @@ const getFujifilmSimulationFromSaturation = ( ): FujifilmSimulationFromSaturation | undefined => { switch (value) { case 0x300: return 'Monochrome'; - case 0x301: return 'Monochrome + R Filter'; - case 0x302: return 'Monochrome + Ye Filter'; - case 0x303: return 'Monochrome + G Filter'; + case 0x301: return 'Monochrome + R'; + case 0x302: return 'Monochrome + Ye'; + case 0x303: return 'Monochrome + G'; case 0x310: return 'Sepia'; - case 0x500: return 'ACROS'; - case 0x501: return 'ACROS + R Filter'; - case 0x502: return 'ACROS + Ye Filter'; - case 0x503: return 'ACROS + G Filter'; + case 0x500: return 'Acros'; + case 0x501: return 'Acros + R'; + case 0x502: return 'Acros + Ye'; + case 0x503: return 'Acros + G'; } }; @@ -76,25 +82,57 @@ const getFujifilmMode = ( value?: number, ): FujifilmMode | undefined => { switch (value) { - case 0x000: return 'Provia / Standard'; - case 0x100: - case 0x110: - case 0x120: - case 0x130: - case 0x300: return 'ASTIA / Soft'; + case 0x000: return 'Provia'; + case 0x100: return 'Portrait'; + case 0x110: return 'Portrait Saturation'; + case 0x120: return 'Portrait Skin Tone'; + case 0x130: return 'Portrait Sharpness'; + case 0x300: return 'Portrait Ex'; case 0x200: - case 0x400: return 'Velvia / Vivid'; + case 0x400: return 'Velvia'; case 0x500: return 'Pro Neg. Std'; case 0x501: return 'Pro Neg. Hi'; case 0x600: return 'Classic Chrome'; - case 0x700: return 'ETERNA / Cinema'; + case 0x700: return 'Eterna'; case 0x800: return 'Classic Neg.'; - case 0x900: return 'ETERNA Bleach Bypass'; + case 0x900: return 'Eterna Bleach Bypass'; case 0xa00: return 'Nostalgic Neg.'; - case 0xb00: return 'REALA ACE'; + case 0xb00: return 'Reala'; } }; +const LABEL_FOR_FILM_SIMULATION: Record = { + 'Monochrome': 'Monochrome', + 'Monochrome + Ye': 'Monochrome + Yellow Filter', + 'Monochrome + R': 'Monochrome + Red Filter', + 'Monochrome + G': 'Monochrome + Green Filter', + 'Sepia': 'Sepia', + 'Acros': 'ACROS', + 'Acros + Ye': 'ACROS + Yellow Filter', + 'Acros + R': 'ACROS + Red Filter', + 'Acros + G': 'ACROS + Green Filter', + 'Provia': 'PROVIA / Standard', + 'Portrait': 'Studio Portrait', + 'Portrait Saturation': 'Studio Portrait + Enhanced Saturation', + 'Portrait Skin Tone': 'ASTIA / Soft', + 'Portrait Sharpness': 'Studio Portrait + Enhanced Sharpness', + 'Portrait Ex': 'Studio Portrait Ex', + 'Velvia': 'Velvia / Vivid', + 'Pro Neg. Std': 'PRO Neg. Std', + 'Pro Neg. Hi': 'PRO Neg. Hi', + 'Classic Chrome': 'Classic Chrome', + 'Eterna': 'ETERNA / Cinema', + 'Classic Neg.': 'Classic Neg.', + 'Eterna Bleach Bypass': 'ETERNA Bleach Bypass', + 'Nostalgic Neg.': 'Nostalgic Neg.', + 'Reala': 'REALA ACE', +}; + +export const getLabelForFilmSimulation = ( + simulation: FujifilmSimulation +): string => + LABEL_FOR_FILM_SIMULATION[simulation]; + export const getFujifilmSimulationFromMakerNote = ( bytes: Buffer, ): FujifilmSimulation | undefined => {