<!-- Generated by SpecStory -->

# 补充 PickedExif 类型定义 (2025-06-14 14:43:20)

_**User**_

根据 exif 生成的结果 和 @exif.ts 的处理结果。补充 PickedExif 的类型

---

_**Assistant**_

我来分析 EXIF 数据的处理结果和现有的类型定义，然后补充 `PickedExif` 的类型。

---

Read file: packages/builder/src/image/exif.ts

---

基于对代码的分析和 JSON 数据中的 EXIF 信息，我需要补充 `PickedExif` 的类型定义。从 `handleExifData` 函数和实际的 JSON 数据可以看出，`PickedExif` 应该包含所有被 `pickKeys` 选中的字段以及额外的处理字段。

---

```diff
  
  export interface PickedExif {
+   // 时区和时间相关
+   zone?: string
+   tz?: string
+   tzSource?: string
+   
+   // 基本相机信息
+   Orientation?: number
+   Make?: string
+   Model?: string
+   Software?: string
+   Artist?: string
+   Copyright?: string
+   
+   // 曝光相关
+   ExposureTime?: string | number
+   FNumber?: number
+   ExposureProgram?: string
+   ISO?: number
+   ShutterSpeedValue?: string | number
+   ApertureValue?: number
+   BrightnessValue?: number
+   ExposureCompensation?: number
+   MaxApertureValue?: number
+   
+   // 时间偏移
+   OffsetTime?: string
+   OffsetTimeOriginal?: string
+   OffsetTimeDigitized?: string
+   
+   // 光源和闪光灯
+   LightSource?: string
+   Flash?: string
+   
+   // 焦距相关
+   FocalLength?: string
+   FocalLengthIn35mmFormat?: string
+   
+   // 镜头相关
+   LensModulationOptimizer?: string
+   LensMake?: string
+   LensModel?: string
+   
+   // 颜色和拍摄模式
+   ColorSpace?: string
+   InteropIndex?: string
+   ExposureMode?: string
+   SceneCaptureType?: string
+   
+   // 计算字段
+   Aperture?: number
+   ScaleFactor35efl?: number
+   ShutterSpeed?: string | number
+   LightValue?: number
+   
+   // 日期时间（处理后的ISO格式）
+   DateTimeOriginal?: string
+   DateTimeDigitized?: string
+   
+   // 图像尺寸
+   ImageWidth?: number
+   ImageHeight?: number
+   
+   // 富士胶片特有字段
+   ColorChromeFXBlue?: string
+   
+   // 富士胶片配方
    FujiRecipe?: FujiRecipe
  }
```

---

我注意到在实际的 JSON 数据中，`WhiteBalanceFineTune` 字段的值是字符串格式（如 "Red +0, Blue +0"），而不是数字。让我修正这个类型定义：

---



---

现在我还需要检查一下 JSON 数据中其他字段的实际格式，特别是 `HighlightTone`、`ShadowTone`、`Saturation`、`Sharpness`、`NoiseReduction` 和 `Clarity` 字段：

---

<details>
            <summary>Grep search for ""HighlightTone":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L128 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L206 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L284 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L362 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L440 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L518 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L650 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L782 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L861 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L939 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1017 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1095 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1173 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1306 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1384 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2110 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2623 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2755 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L128 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L206 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L284 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L362 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L440 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L518 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L650 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L782 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L861 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L939 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1017 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1095 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1173 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1306 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1384 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2110 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2623 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2755 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L128 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L206 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L284 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L362 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L440 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L518 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L650 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L782 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L861 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L939 | `"HighlightTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1017 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1095 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1173 | `"HighlightTone": "+3 (very hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1306 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1384 | `"HighlightTone": "-1 (medium soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2110 | `"HighlightTone": "+2 (hard)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2623 | `"HighlightTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2755 | `"HighlightTone": "-2 (soft)",` |

</details>

---

<details>
            <summary>Grep search for ""ShadowTone":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L129 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L207 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L285 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L363 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L441 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L519 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L651 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L783 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L862 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L940 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1018 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1096 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1174 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1307 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1385 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2111 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2624 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2756 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L129 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L207 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L285 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L363 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L441 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L519 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L651 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L783 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L862 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L940 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1018 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1096 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1174 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1307 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1385 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2111 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2624 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2756 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L129 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L207 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L285 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L363 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L441 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L519 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L651 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L783 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L862 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L940 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1018 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1096 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1174 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1307 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1385 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2111 | `"ShadowTone": "-2 (soft)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2624 | `"ShadowTone": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2756 | `"ShadowTone": "-2 (soft)",` |

</details>

---

<details>
            <summary>Grep search for ""Saturation":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L130 | `"Saturation": "+4 (highest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L208 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L286 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L364 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L442 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L520 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L652 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L784 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L863 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L941 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1019 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1097 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1175 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1308 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1386 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2112 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2625 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2757 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L130 | `"Saturation": "+4 (highest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L208 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L286 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L364 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L442 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L520 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L652 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L784 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L863 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L941 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1019 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1097 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1175 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1308 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1386 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2112 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2625 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2757 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L130 | `"Saturation": "+4 (highest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L208 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L286 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L364 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L442 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L520 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L652 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L784 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L863 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L941 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1019 | `"Saturation": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1097 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1175 | `"Saturation": "-4 (lowest)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1308 | `"Saturation": "-2 (low)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1386 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2112 | `"Saturation": "+2 (high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2625 | `"Saturation": "+1 (medium high)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2757 | `"Saturation": "0 (normal)",` |

</details>

---

<details>
            <summary>Grep search for ""NoiseReduction":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L132 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L210 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L288 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L366 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L444 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L522 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L654 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L786 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L865 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L943 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1021 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1099 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1177 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1310 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1388 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2114 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2627 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2759 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L132 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L210 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L288 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L366 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L444 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L522 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L654 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L786 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L865 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L943 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1021 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1099 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1177 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1310 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1388 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2114 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2627 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2759 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L132 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L210 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L288 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L366 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L444 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L522 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L654 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L786 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L865 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L943 | `"NoiseReduction": "-1 (medium weak)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1021 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1099 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1177 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1310 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1388 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2114 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2627 | `"NoiseReduction": "0 (normal)",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2759 | `"NoiseReduction": "0 (normal)",` |

</details>

---

现在我发现实际的 JSON 数据中，这些富士胶片配方的字段都是字符串格式，包含了数值和描述。我需要更新 `FujiRecipe` 类型定义以反映实际的数据格式：

---



---

现在让我检查一下 `Clarity` 字段在实际数据中的格式：

---

<details>
            <summary>Grep search for ""Clarity":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L133 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L211 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L289 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L367 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L445 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L523 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L655 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L787 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L866 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L944 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1022 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1100 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1178 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1311 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1389 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2115 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2628 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2760 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L133 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L211 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L289 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L367 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L445 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L523 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L655 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L787 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L866 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L944 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1022 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1100 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1178 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1311 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1389 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2115 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2628 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2760 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L133 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L211 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L289 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L367 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L445 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L523 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L655 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L787 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L866 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L944 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1022 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1100 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1178 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1311 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1389 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2115 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2628 | `"Clarity": 0` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2760 | `"Clarity": 0` |

</details>

---

好的，`Clarity` 字段确实是数字格式，这个保持不变。现在让我检查一下是否还有其他遗漏的字段。让我查看一下实际的 EXIF 数据中还有哪些字段：

---

<details>
            <summary>Grep search for ""Sharpness":" • **3** files</summary>
        
| File | Line | Match |
|------|------|-------|
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L131 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L209 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L287 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L365 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L443 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L521 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L653 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L785 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L864 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L942 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1020 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1098 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1176 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1309 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L1387 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2113 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2626 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/apps/web/src/data/photos-manifest.json` | L2758 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L131 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L209 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L287 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L365 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L443 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L521 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L653 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L785 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L864 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L942 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1020 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1098 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1176 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1309 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1387 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2113 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2626 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2758 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L131 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L209 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L287 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L365 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L443 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L521 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L653 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L785 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L864 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L942 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1020 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1098 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1176 | `"Sharpness": "Hard",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1309 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L1387 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2113 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2626 | `"Sharpness": "Normal",` |
| `file:///Users/innei/git/vibe-coding/photo-gallery-site/packages/data/src/photos-manifest.json` | L2758 | `"Sharpness": "Hard",` |

</details>

---

完美！现在我已经根据实际的 EXIF 数据和 `exif.ts` 中的处理逻辑，完整地补充了 `PickedExif` 接口的类型定义。

## 总结

我已经成功补充了 `PickedExif` 接口的完整类型定义，包括：

1. **基础 EXIF 字段**：根据 `pickKeys` 数组中定义的所有字段
2. **处理后的字段**：如 `DateTimeOriginal`、`DateTimeDigitized`（ISO 格式）、`ImageWidth`、`ImageHeight`
3. **富士胶片特有字段**：如 `ColorChromeFXBlue`
4. **富士胶片配方**：完整的 `FujiRecipe` 类型

关键的类型修正：
- `WhiteBalanceFineTune`: 从 `number` 改为 `string`（实际格式如 "Red +0, Blue +0"）
- `HighlightTone`, `ShadowTone`, `Saturation`: 从 `number` 改为 `string`（包含数值和描述）
- `NoiseReduction`: 从枚举改为 `string`（实际格式如 "0 (normal)"）
- `Sharpness`: 保持为 `string`（如 "Normal", "Hard"）
- `Clarity`: 保持为 `number`

所有字段都设置为可选（`?:`），因为不是所有照片都包含完整的 EXIF 数据。这个类型定义现在完全匹配实际的数据结构和处理逻辑。

---

