Make Fujifilm simulations more robust
This commit is contained in:
parent
07ec113542
commit
7509b96c20
@ -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<FujifilmSimulation, string> = {
|
||||
'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 => {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user