Files
SnapOtter/apps/docs/uk/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

6.3 KiB

description, i18n_source_hash, i18n_provenance, i18n_output_hash
description i18n_source_hash i18n_provenance i18n_output_hash
Виявляє дублікати та майже однакові зображення за допомогою перцептивного хешування. 4e1f4413f90f human 81c996d6af9c

Пошук дублікатів

Завантажте кілька зображень, щоб виявити дублікати та майже однакові зображення за допомогою перцептивного хешування (dHash). Групує схожі зображення разом, визначає найякіснішу версію в кожній групі та обчислює потенційну економію місця.

API Endpoint

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

Приймає дані форми multipart з кількома файлами зображень та необовʼязковим полем JSON settings.

Параметри

Параметр Тип Обовʼязковий За замовчуванням Опис
threshold number Ні 8 Максимальна відстань Геммінга, за якої зображення вважаються дублікатами (від 0 до 20). Менше значення = суворіше зіставлення

Поля файлів

Завантажте щонайменше 2 файли зображень у запиті multipart (усі з іменем поля 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, а не спричиняють збій усього запиту.
  • Мініатюри — це JPEG-прев'ю шириною 200px, закодовані як data URI.
  • Підтримуються всі поширені формати (HEIC, RAW, PSD, SVG декодуються автоматично).