A:增加架构逻辑

This commit is contained in:
jimmy committed 2025-08-02 20:30:55 +08:00
1 parent 3bb4fc0b08
commit ce89028f4d
1 file changed
+259 -1
+259 -1
View File
@@ -337,4 +337,262 @@ grep "ERROR" app-logs/app.log
# 设置日志级别为debug
export LOG_LEVEL=debug
./rear
```
```
## 图像处理与存储设计方案
本图像管理软件旨在高效、安全、结构化地处理和管理本地图片。下列内容描述了图像格式支持、数据表结构、处理逻辑、缩略图策略、重复图判断、EXIF 信息提取、GIF/视频支持等核心模块。
---
### 支持格式与格式转换策略
软件仅支持 `JPG` 与 `WebP` 作为基础展示格式。其他图像或视频格式将自动转换为这两种格式,以获得更好的浏览器兼容性与性能。
#### 格式处理规则:
- **RAW 图像**:
- 使用 `exiftool` 读取 EXIF 信息;
- 使用 `ImageMagick` 转换为 `PNG`(以保留最高画质);
- 再由 `libvips` 转换为 `JPG` 或 `WebP`。
- **PNG 图像**:
- 使用 `libvips` 转换为 `JPG` 或 `WebP`;
- 转换完成后删除临时 PNG 文件。
- **JPG/WebP 图像**:
- 若为原始文件,直接进入缩略图生成流程;
- 若由 PNG 转换而来,则在缩略图目录生成一份“原图副本”供未来访问。
- **GIF 图像**:
- 拆分为“封面图 + 视频 (MP4)”进行存储;
- 浏览器中预览封面,点击后播放视频。
- **视频(MP4、AVI、MKV 等)**:
- 使用 `ffmpeg` 统一转码为 `MP4(H.264)`;
- 同时生成封面图用于展示。
- **LivePhoto / MotionPhoto**:
- 处理方式与 GIF 类似,提取图片和视频部分,分离存储;
- 当前仅支持 LivePhoto,未来计划支持 MotionPhoto。
---
### 数据库存储结构
#### `photos` 表(图像主信息表)
| 字段名 | 说明 |
|-------------------|------------------------|
| `hash` | 图像 SHA-256 值,作为主键 |
| `width` | 图像宽度 |
| `height` | 图像高度 |
| `format` | 原始格式(jpg/webp) |
| `file_size` | 文件大小(字节) |
| `file_path` | 原始文件路径 |
| `created_at` | 创建时间 |
| `updated_at` | 更新时间 |
| `has_face` | 是否检测到人脸 |
| `has_object` | 是否检测到物体 |
| `has_scene` | 是否检测到场景 |
| `has_text` | 是否检测到文字 |
| `accessed_at` | 最近访问时间 |
| `access_count` | 累计访问次数 |
#### `photo_exif` 表(EXIF 信息表)
- 如果没有对应数据,说明图像尚未进行 EXIF 提取。
| 字段名 | 说明 |
|---------------------|---------------------|
| `hash` | 对应图像哈希 |
| `width` | 图像宽度 |
| `height` | 图像高度 |
| `format` | 原始格式 |
| `file_size` | 文件大小 |
| `created_at` | 创建时间 |
| `updated_at` | 更新时间 |
| `make` | 相机厂商 |
| `model` | 相机型号 |
| `exposure_time` | 曝光时间 |
| `f_number` | 光圈 |
| `iso_speed_ratings` | ISO 感光度 |
| `focal_length` | 焦距 |
| `datetime_original` | 拍摄时间 |
| `gps_latitude` | 纬度 |
| `gps_longitude` | 经度 |
---
### 原图获取逻辑
- 若原图为 JPG 或 WebP,直接返回原路径;
- 若原图来源为 PNG/RAW 转换:
- 检查 `缩略图目录` 是否存在“原图副本”;
- 若存在,返回其路径;
- 若不存在,自动生成副本后返回路径。
---
### 缩略图生成与存储
#### 缩略图生成流程:
1. 所有图像最终转换为 JPG 或 WebP;
2. 使用 `libvips` 根据尺寸生成缩略图;
3. Hash 用于构建路径,避免单目录内文件过多。
#### 缩略图路径结构:
```
/app/temp/thumbnail/{h1}{h2}/{h3}{h4}/{hash剩余部分}/{size}.jpg
```
**示例:**
假设图像 Hash 为 `12903jowi3ej49rq2r834ru3q49itj`,则缩略图路径为:
```
/app/temp/thumbnail/12/90/3jowi3ej49rq2r834ru3q49itj/original.jpg
/app/temp/thumbnail/12/90/3jowi3ej49rq2r834ru3q49itj/300X300.jpg
/app/temp/thumbnail/12/90/3jowi3ej49rq2r834ru3q49itj/500X500.jpg
```
4. 若目标缩略图已存在,则直接返回路径;
5. 若不存在,则自动生成后返回。
---
### 缩略图裁剪与压缩策略
- 默认按原始比例等比压缩;
- 对于比例极端的图片(如长截图、全景图):
- 默认最小宽度为 `300px`,最长边不超过 `1:10`;
- 中心裁剪为 `300x600` 或其它合理尺寸;
- 例:原图 `1000x100`,裁剪为 `300x600`(中间区域);
- 若原图本身较小(如 `300x300`),则不裁剪,直接使用原图。
---
### EXIF 信息提取逻辑
1. 获取图像的 SHA-256 Hash;
2. 查询数据库:
- 若已存在 EXIF 数据,则直接返回;
- 若不存在,则使用 `exiftool` 读取并存储。
---
### 重复图片处理机制
- 每张图片以 Hash(SHA-256)作为唯一标识;
- 若系统中已存在相同 Hash 的图像:
- 添加记录至 `duplicate_images` 表,保存路径;
- 图像预览界面不显示重复图像,仅在“文件夹视图”中展示全部图像。
---
### GIF 与视频支持
#### GIF
- 拆分为“封面图 + 视频文件”结构;
- 浏览器中显示封面图,点击播放视频;
- 视频统一为 MP4 格式,使用 `ffmpeg` 转换。
#### 视频
- 支持格式:MP4、AVI、MKV 等;
- 全部统一转换为 `MP4(H.264)` 格式;
- 同时生成封面图,用于前端快速预览。
---
### LivePhoto 与 MotionPhoto
- 当前支持 Apple 的 LivePhoto;
- 拆解图片 + 视频部分,按 GIF 处理逻辑处理;
- 未来支持 Android 的 MotionPhoto。
---
### 新图像批量处理流程
1. 使用协程进行并发处理,处理流程如下:
- 获取文件 Hash;
- 判断原图与缩略图是否存在;
- 若不存在,则生成;
- 图像立即可展示于 Web 前端。
2. 异步调用 Python API 进行智能分析:
- 人脸识别
- 场景识别
- 物体识别
- OCR 文字识别
3. 识别结果写入数据库,并同步状态。
4. **并发限制策略**:
- 并发数 = `min(可用内存, CPU核心数)`;
- 若内存不足,则暂停新任务;
- 若 CPU 紧张,则减慢并发速率。
---
### 示例原始路径与处理流程
- 原始 RAW 图路径:
`/user/photo/2020-1-1/camera/202001011011.raw`
- PNG 临时路径(若不存在则生成):
`/app/temp/png-tmp/202001011011.png`
- 缩略图路径结构(假设 Hash 为 `12903jowi3ej49rq2r834ru3q49itj`):
```
/app/temp/thumbnail/12/90/3jowi3ej49rq2r834ru3q49itj/original.jpg
/app/temp/thumbnail/12/90/3jowi3ej49rq2r834ru3q49itj/300X300.jpg
```
---
## 未来规划(可选模块)
- 图像标签管理与备注功能
- 图像来源标记(导入、自同步、扫码等)
- 任务状态表(支持失败重试、日志记录)
- 图像相似度分析(非哈希完全一致)
- 图像分享与链接生成模块(带水印/权限)
---
```mermaid
flowchart TD
A[开始导入图像] --> B{图像格式?}
B -->|RAW| C1[使用 exiftool 读取 EXIF] --> C2[使用 ImageMagick 转换为 PNG]
C2 --> C3[使用 libvips 转换为 JPG/WebP] --> D1[图像入库]
B -->|PNG| D2[使用 libvips 转换为 JPG/WebP] --> D1
B -->|JPG/WebP| D3[直接使用原图] --> D1
D1 --> E[计算图像 Hash]
E --> F[写入数据库 photo 表 / exif 表]
F --> G{是否已存在缩略图?}
G -->|是| H1[跳过生成,直接返回路径]
G -->|否| H2[使用 libvips 生成多尺寸缩略图]
H1 --> I[进行智能识别(可选)]
H2 --> I
I --> J[更新数据库标记]
J --> K[处理结束]
```