Files
SnapOtter/apps/docs/zh-CN/tools/image/find-duplicates.md
T
SnapOtterandGitHub 4963ab3bbd feat(docs-i18n): translate all documentation into 20 languages
All 181 docs markdown files translated into 20 languages (apps/docs/<locale>/**). Companion to the i18n code PR; admin-merged because the file count exceeds GitHub's per-PR CI trigger limit. Validated by pnpm i18n:check (all surfaces, 0 stale/missing) and a clean all-locale docs build.
2026-07-11 13:52:47 +08:00

4.0 KiB

description, i18n_source_hash, i18n_provenance, i18n_output_hash
description i18n_source_hash i18n_provenance i18n_output_hash
使用感知哈希检测重复和近似重复的图像。 4e1f4413f90f human 2cf60b9dc81a

查找重复项

上传多张图像,使用感知哈希(dHash)检测重复和近似重复的图像。将相似图像分组,识别每组中质量最佳的版本,并计算可节省的潜在空间。

API 端点

POST /api/v1/tools/image/find-duplicates

接受包含多个图像文件的 multipart 表单数据,以及一个可选的 JSON settings 字段。

参数

参数 类型 是否必填 默认值 说明
threshold number 8 将图像视为重复项的最大汉明距离(0 到 20)。值越小匹配越严格

文件字段

在 multipart 请求中上传至少 2 个图像文件(全部使用 file 字段名,或对文件部分使用任意字段名)。

请求示例

curl -X POST http://localhost:1349/api/v1/tools/image/find-duplicates \
  -H "Authorization: Bearer si_your-api-key" \
  -F "file=@photo1.jpg" \
  -F "file=@photo2.jpg" \
  -F "file=@photo3.jpg" \
  -F "file=@photo4.jpg" \
  -F 'settings={"threshold": 8}'

响应示例

{
  "totalImages": 4,
  "duplicateGroups": [
    {
      "groupId": 1,
      "files": [
        {
          "filename": "photo1.jpg",
          "similarity": 100,
          "width": 4032,
          "height": 3024,
          "fileSize": 2450000,
          "format": "jpeg",
          "isBest": true,
          "thumbnail": "data:image/jpeg;base64,/9j/..."
        },
        {
          "filename": "photo2.jpg",
          "similarity": 96.88,
          "width": 1920,
          "height": 1440,
          "fileSize": 850000,
          "format": "jpeg",
          "isBest": false,
          "thumbnail": "data:image/jpeg;base64,/9j/..."
        }
      ]
    }
  ],
  "uniqueImages": 2,
  "spaceSaveable": 850000,
  "skippedFiles": []
}

响应字段

字段 类型 说明
totalImages number 成功分析的图像数量
duplicateGroups array 重复图像的分组
uniqueImages number 不属于任何重复分组的图像数量
spaceSaveable number 移除非最佳重复项后可节省的总字节数
skippedFiles array 无法处理的文件(含文件名和原因)

重复分组对象

字段 类型 说明
groupId number 分组标识符
files array 此重复分组中的图像

文件对象(分组内)

字段 类型 说明
filename string 原始文件名
similarity number 与参考图像(分组中的第一张)的相似度百分比
width number 图像宽度(像素)
height number 图像高度(像素)
fileSize number 文件大小(字节)
format string 图像格式
isBest boolean 是否为质量最高的版本(像素最多、文件最大)
thumbnail string 或 null 用于预览的 Base64 JPEG 缩略图(200px 宽)

说明

  • 使用 128 位 dHash(64 位行 + 64 位列)进行感知相似度检测。即使经过缩放、重新压缩和轻微编辑,也能识别出重复项。
  • 阈值表示两个哈希之间的最大汉明距离。默认值 8 可捕获近似重复项,同时避免误报。使用 0 表示仅识别像素完全相同的图像,使用 15-20 表示非常宽松的匹配。
  • 每组中的“最佳”图像是像素最多(宽 x 高)的那张,以文件大小作为决胜依据。
  • 至少需要 2 张图像。验证或解码失败的文件会在 skippedFiles 中报告,而不会导致整个请求失败。
  • 缩略图是编码为 data URI 的 200px 宽 JPEG 预览图。
  • 支持所有常见格式(HEIC、RAW、PSD、SVG 会被自动解码)。