<!-- Generated by SpecStory -->

# 增加 EXIF 信息展示 (2025-05-25 21:19:00)

_**User**_

增加更多 Exif 信息的展示

---

_**Assistant**_

我来帮你增加更多 EXIF 信息的展示。让我先查看一下当前的代码结构，然后添加更多有用的 EXIF 信息。

---

```diff
                <span>{(currentPhoto.size / 1024 / 1024).toFixed(1)}MB</span>
              </div>
+             {formattedExifData?.colorSpace && (
+               <div className="flex justify-between">
+                 <span className="text-white/60">色彩空间</span>
+                 <span>{formattedExifData.colorSpace}</span>
+               </div>
+             )}
            </div>
          </div>
```

```diff
                    设备信息
                  </h4>
-                 <div className="text-sm">
+                 <div className="space-y-1 text-sm">
                    <div className="flex justify-between">
                      <span className="text-white/60">相机</span>
                      <span>{formattedExifData.camera}</span>
                    </div>
+                   {formattedExifData.lens && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">镜头</span>
+                       <span>{formattedExifData.lens}</span>
+                     </div>
+                   )}
+                   {formattedExifData.software && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">软件</span>
+                       <span>{formattedExifData.software}</span>
+                     </div>
+                   )}
                  </div>
                </div>
```

```diff
                </div>
              </div>
+ 
+             {/* 新增：拍摄模式信息 */}
+             {(formattedExifData.exposureMode || formattedExifData.meteringMode || formattedExifData.whiteBalance || formattedExifData.flash) && (
+               <div>
+                 <h4 className="text-sm font-medium text-white/80 mb-2">
+                   拍摄模式
+                 </h4>
+                 <div className="space-y-1 text-sm">
+                   {formattedExifData.exposureMode && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">曝光模式</span>
+                       <span>{formattedExifData.exposureMode}</span>
+                     </div>
+                   )}
+                   {formattedExifData.meteringMode && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">测光模式</span>
+                       <span>{formattedExifData.meteringMode}</span>
+                     </div>
+                   )}
+                   {formattedExifData.whiteBalance && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">白平衡</span>
+                       <span>{formattedExifData.whiteBalance}</span>
+                     </div>
+                   )}
+                   {formattedExifData.flash && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">闪光灯</span>
+                       <span>{formattedExifData.flash}</span>
+                     </div>
+                   )}
+                 </div>
+               </div>
+             )}
+ 
+             {/* 新增：镜头信息 */}
+             {(formattedExifData.focalLength || formattedExifData.maxAperture || formattedExifData.digitalZoom) && (
+               <div>
+                 <h4 className="text-sm font-medium text-white/80 mb-2">
+                   镜头信息
+                 </h4>
+                 <div className="space-y-1 text-sm">
+                   {formattedExifData.focalLength && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">实际焦距</span>
+                       <span>{formattedExifData.focalLength}mm</span>
+                     </div>
+                   )}
+                   {formattedExifData.maxAperture && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">最大光圈</span>
+                       <span>f/{formattedExifData.maxAperture}</span>
+                     </div>
+                   )}
+                   {formattedExifData.digitalZoom && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">数字变焦</span>
+                       <span>{formattedExifData.digitalZoom}x</span>
+                     </div>
+                   )}
+                 </div>
+               </div>
+             )}
+ 
+             {/* 新增：GPS位置信息 */}
+             {formattedExifData.gps && (
+               <div>
+                 <h4 className="text-sm font-medium text-white/80 mb-2">
+                   位置信息
+                 </h4>
+                 <div className="space-y-1 text-sm">
+                   <div className="flex justify-between">
+                     <span className="text-white/60">纬度</span>
+                     <span>{formattedExifData.gps.latitude}°</span>
+                   </div>
+                   <div className="flex justify-between">
+                     <span className="text-white/60">经度</span>
+                     <span>{formattedExifData.gps.longitude}°</span>
+                   </div>
+                   {formattedExifData.gps.altitude && (
+                     <div className="flex justify-between">
+                       <span className="text-white/60">海拔</span>
+                       <span>{formattedExifData.gps.altitude}m</span>
+                     </div>
+                   )}
+                 </div>
+               </div>
+             )}
  
              {formattedExifData.dateTime && (
```

```diff
    const photo = exif.Photo || {}
    const image = exif.Image || {}
+   const gps = exif.GPS || {}
  
    // 等效焦距 (35mm)
```

```diff
      (photo.FocalLength ? Math.round(photo.FocalLength) : null)
  
+   // 实际焦距
+   const focalLength = photo.FocalLength ? Math.round(photo.FocalLength) : null
+ 
    // ISO
    const iso = photo.ISOSpeedRatings || image.ISOSpeedRatings
```

```diff
    const aperture = photo.FNumber ? `f/${photo.FNumber}` : null
  
+   // 最大光圈
+   const maxAperture = photo.MaxApertureValue 
+     ? `${Math.round(Math.pow(Math.sqrt(2), photo.MaxApertureValue) * 10) / 10}`
+     : null
+ 
    // 相机信息
    const camera =
      image.Make && image.Model ? `${image.Make} ${image.Model}` : null
  
+   // 镜头信息
+   const lens = photo.LensModel || photo.LensSpecification || null
+ 
+   // 软件信息
+   const software = image.Software || null
+ 
    // 拍摄时间
    const dateTime = photo.DateTimeOriginal || photo.DateTime
+ 
+   // 曝光模式
+   const exposureModeMap: Record<number, string> = {
+     0: '自动曝光',
+     1: '手动曝光',
+     2: '自动包围曝光'
+   }
+   const exposureMode = photo.ExposureMode !== undefined 
+     ? exposureModeMap[photo.ExposureMode] || `未知 (${photo.ExposureMode})`
+     : null
+ 
+   // 测光模式
+   const meteringModeMap: Record<number, string> = {
+     0: '未知',
+     1: '平均测光',
+     2: '中央重点测光',
+     3: '点测光',
+     4: '多点测光',
+     5: '评价测光',
+     6: '局部测光'
+   }
+   const meteringMode = photo.MeteringMode !== undefined
+     ? meteringModeMap[photo.MeteringMode] || `未知 (${photo.MeteringMode})`
+     : null
+ 
+   // 白平衡
+   const whiteBalanceMap: Record<number, string> = {
+     0: '自动白平衡',
+     1: '手动白平衡'
+   }
+   const whiteBalance = photo.WhiteBalance !== undefined
+     ? whiteBalanceMap[photo.WhiteBalance] || `未知 (${photo.WhiteBalance})`
+     : null
+ 
+   // 闪光灯
+   const flashMap: Record<number, string> = {
+     0: '未闪光',
+     1: '闪光',
+     5: '闪光，未检测到回闪',
+     7: '闪光，检测到回闪',
+     9: '强制闪光',
+     13: '强制闪光，未检测到回闪',
+     15: '强制闪光，检测到回闪',
+     16: '未闪光，强制关闭',
+     24: '未闪光，自动模式',
+     25: '闪光，自动模式',
+     29: '闪光，自动模式，未检测到回闪',
+     31: '闪光，自动模式，检测到回闪',
+     32: '未提供闪光功能'
+   }
+   const flash = photo.Flash !== undefined
+     ? flashMap[photo.Flash] || `未知 (${photo.Flash})`
+     : null
+ 
+   // 数字变焦
+   const digitalZoom = photo.DigitalZoomRatio || null
+ 
+   // 色彩空间
+   const colorSpaceMap: Record<number, string> = {
+     1: 'sRGB',
+     65535: 'Adobe RGB'
+   }
+   const colorSpace = photo.ColorSpace !== undefined
+     ? colorSpaceMap[photo.ColorSpace] || `未知 (${photo.ColorSpace})`
+     : null
+ 
+   // GPS信息
+   let gpsInfo = null
+   if (gps.GPSLatitude && gps.GPSLongitude) {
+     const latitude = convertDMSToDD(gps.GPSLatitude, gps.GPSLatitudeRef)
+     const longitude = convertDMSToDD(gps.GPSLongitude, gps.GPSLongitudeRef)
+     const altitude = gps.GPSAltitude || null
+ 
+     gpsInfo = {
+       latitude: latitude?.toFixed(6),
+       longitude: longitude?.toFixed(6),
+       altitude: altitude ? Math.round(altitude) : null
+     }
+   }
  
    return {
      focalLength35mm,
+     focalLength,
      iso,
      shutterSpeed,
      aperture,
+     maxAperture,
      camera,
+     lens,
+     software,
      dateTime,
-   }
+     exposureMode,
+     meteringMode,
+     whiteBalance,
+     flash,
+     digitalZoom,
+     colorSpace,
+     gps: gpsInfo,
+   }
+ }
+ 
+ // 将度分秒格式转换为十进制度数
+ const convertDMSToDD = (dms: number[], ref: string): number | null => {
+   if (!dms || dms.length !== 3) return null
+   
+   const [degrees, minutes, seconds] = dms
+   let dd = degrees + minutes / 60 + seconds / 3600
+   
+   if (ref === 'S' || ref === 'W') {
+     dd = dd * -1
+   }
+   
+   return dd
  }
  
```

---

我已经成功为 EXIF 面板增加了更多信息的展示。新增的功能包括：

## 新增的 EXIF 信息展示：

### 1. **基本信息增强**
- 色彩空间（sRGB、Adobe RGB 等）

### 2. **设备信息增强**
- 镜头型号
- 软件信息（处理软件）

### 3. **新增拍摄模式部分**
- 曝光模式（自动/手动/包围曝光）
- 测光模式（平均/中央重点/点测光等）
- 白平衡（自动/手动）
- 闪光灯状态（详细的闪光灯信息）

### 4. **新增镜头信息部分**
- 实际焦距（与等效焦距区分）
- 最大光圈值
- 数字变焦倍率

### 5. **新增GPS位置信息**
- 纬度和经度（精确到6位小数）
- 海拔高度（如果有的话）

## 主要改进：

1. **更丰富的信息展示**：从原来的基础参数扩展到包含拍摄模式、镜头详情、GPS位置等专业信息

2. **智能映射**：将 EXIF 数字代码转换为中文描述，如曝光模式、测光模式、闪光灯状态等

3. **GPS坐标转换**：实现了度分秒到十进制度数的转换，便于显示和使用

4. **条件显示**：只有当相应的 EXIF 数据存在时才显示对应的信息块，保持界面整洁

5. **保持原有设计风格**：新增内容完全遵循原有的设计语言和布局结构

现在的 EXIF 面板将能够显示更加全面和专业的照片元数据信息，对于摄影爱好者来说会更加有用。

---

