REST API. Розмиття облич та номерних знаків на фото

Watermarkly Blur API автоматично виявляє та розмиває обличчя й номерні знаки на зображеннях. API повністю працює на інфраструктурі AWS і дбає про конфіденційність — ваші файли ніколи не використовуються для навчання моделей ШІ. Ми використовуємо AWS Lambda для паралельної обробки тисяч запитів, що забезпечує надійну продуктивність і доступність у кількох регіонах світу.

Спробувати безкоштовно

Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.


Основні можливості

Автоматично виявляє та розмиває номерні знаки й обличчя на зображеннях

За бажанням замінює номерні знаки на логотип вашого проєкту або компанії.

Може змінювати розмір, обрізати або конвертувати оброблені зображення.

Підтримує до 500 запитів на секунду.

Обробляє зображення паралельно для швидшої роботи.

Максимальний підтримуваний розмір зображення: 6000 × 6000 пікселів.

API-запити потребують автентифікації через API-ключ.

Якщо вам потрібна швидша обробка, підтримка більших зображень або вища швидкість запитів, зв’яжіться з нами за адресою api-support@watermarkly.com.


Приклади результатів

Обличчя жінки та номерний знак розмито.

API для розмиття облич та номерних знаків на зображеннях

Номерний знак замінено на логотип компанії, а обличчя жінки розмито.

API для розмиття облич та номерних знаків на зображеннях

Отримати API

Ми продаємо API через AWS Marketplace. Вартість: $0.01 / запит. Доступний безкоштовний 7-денний пробний період.


Деталі обробки

  • Оброблені зображення не зберігаються на наших серверах.
  • Сервіс приймає зображення у форматах JPEG, PNG, WEBP, AVIF, HEIC/HEIF.
  • Зображення AVIF та HEIF будуть конвертовані у JPEG, якщо не вказано інший формат.
  • Максимальний розмір вхідного зображення:
    • GET-запити: 20 МБ або 6000x6000 пікселів.
    • POST-запити: 6 МБ або 6000x6000 пікселів.
  • Обмеження швидкості API:
    • 500 паралельних запитів
    • 500 запитів на секунду
    • 100 000 запитів на день

Кінцеві точки API

Регіони

Наразі ми надаємо API у двох регіонах:

Ви можете використовувати будь-яку кінцеву точку на свій розсуд. Другу кінцеву точку можна використовувати як резервну на випадок недоступності одного регіону AWS. Якщо вам потрібен API в іншому регіоні, повідомте нас.

Методи запитів

Ви можете надсилати зображення для обробки за допомогою GET або POST запитів. Якщо ваші зображення загальнодоступні, рекомендуємо використовувати GET-запити, оскільки вони дещо швидші за POST-запити.

Розмиття зображення за допомогою GET-запиту (рекомендовано)

GET https://blur-api-eu1.watermarkly.com/blur/?url={image_url}

або

GET https://blur-api-us1.watermarkly.com/blur/?url={image_url}

Сервіс завантажує зображення з image_url та обробляє його.

Запит

  • Метод: GET
  • Заголовки:
    • x-api-key: Ваш API-ключ
  • Параметри URL-запиту:
    • url (Обов’язковий): Повна URL-адреса зображення для обробки.
    • blur_intensity (Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.
    • file_size (Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.
    • width (Необов’язковий): Вказує бажану ширину вихідного зображення.
    • height (Необов’язковий): Вказує бажану висоту вихідного зображення.
    • format (Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.
    • logo_url (Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.
    • logo_size (Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.
    • plate_screws (Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.

Відповідь

Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.

Відповідь з помилкою: (HTTP-статус: 500, 403)

{
  "message": "Error message"
}

Розмиття зображення за допомогою POST-запиту

POST https://blur-api-eu1.watermarkly.com/blur/

або

POST https://blur-api-us1.watermarkly.com/blur/

Надсилає зображення для обробки.

Запит

  • Метод: POST
  • Content-Type: application/octet-stream
  • Заголовки:
    • x-api-key: Ваш API-ключ
  • Параметри запиту:
    • blur_intensity (Необов’язковий): Число з плаваючою комою від 0.0 до 20.0, що регулює інтенсивність розмиття. За замовчуванням: 1.0. Значення 0.0 вимикає розмиття.
    • file_size (Необов’язковий): Вказує бажаний розмір вихідного файлу в байтах. Сервіс намагається повернути зображення, яке не перевищує цей розмір.
    • width (Необов’язковий): Вказує бажану ширину вихідного зображення.
    • height (Необов’язковий): Вказує бажану висоту вихідного зображення.
    • format (Необов’язковий): Вказує бажаний формат вихідного зображення. Можливі значення: JPEG, PNG, WEBP.
    • logo_url (Необов’язковий): URL-адреса файлу логотипу для розміщення на номерних знаках. Може бути HTTP URL або data URL. Переконайтеся, що URL правильно екранований перед передачею як параметр запиту.
    • logo_size (Необов’язковий): Вказує розмір логотипу як число від 0.1 до 1.0.
    • plate_screws (Необов’язковий): Додає гвинти на номерні знаки. Працює лише разом з параметром logo_url.

Відповідь

Успішна відповідь: (HTTP-статус: 200) Сервіс повертає оброблене зображення в одному з форматів: JPEG, PNG, WEBP.

Відповідь з помилкою: (HTTP-статус: 500, 403)

{
  "message": "Error message"
}

Приклади використання

Python

import requests
import urllib.parse

API_KEY = 'your_api_key'
API_URL = 'https://blur-api-eu1.watermarkly.com/blur/'

input_path = ''       # Шлях до локального зображення
output_path = ''      # Шлях для збереження результату

# Розмиття зображення за допомогою POST-запиту
with open(input_path, 'rb') as image_file:
    response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
    if response.status_code == 429:
        # Перевищено ліміт запитів API, зачекайте трохи
        time.sleep(0.1)
        response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
# Збереження обробленого зображення локально
with open(output_path, 'wb') as f:
    f.write(response.content)


# Розмиття зображення за допомогою GET-запиту
encoded_url = urllib.parse.quote("https://nikitin.io/eqe.jpg", safe='')
response = requests.get(API_URL + "?url=" + encoded_url, headers={'x-api-key': API_KEY})
# Збереження відповіді локально
with open(output_path, 'wb') as f:
    f.write(response.content)

NodeJS

import { promises as fs } from "node:fs";

const API_KEY = 'your_api_key';
const API_URL = 'https://blur-api-eu1.watermarkly.com/blur/';

// Допоміжна функція для паузи виконання на задану кількість мілісекунд
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

(async () => {
  // Розмиття зображення за допомогою POST-запиту
  try {
    const inputPath = 'input_path_here';   // Замініть на ваш реальний шлях до вхідного файлу
    const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження

    // Асинхронне читання файлу зображення як бінарних даних
    const imageData = await fs.readFile(inputPath);

    let response = await fetch(API_URL, {
      method: 'POST',
      headers: {
        'x-api-key': API_KEY,
        'Content-Type': 'application/octet-stream'
      },
      body: imageData
    });

    if (response.status === 429) {
      // Перевищено ліміт запитів API, зачекайте трохи
      await sleep(100); // пауза на 0.1 секунди
      response = await fetch(API_URL, {
        method: 'POST',
        headers: {
          'x-api-key': API_KEY,
          'Content-Type': 'application/octet-stream'
        },
        body: imageData
      });
    }
    // Асинхронне збереження обробленого зображення локально
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during POST request:', error);
  }

  // Розмиття зображення за допомогою GET-запиту
  try {
    const outputPath = 'output_path_here'; // Замініть на ваш реальний шлях для збереження
    const encodedUrl = encodeURIComponent("https://nikitin.io/eqe.jpg"); // Кодування URL
    const response = await fetch(`${API_URL}?url=${encodedUrl}`, {
      method: 'GET',
      headers: {
        'x-api-key': API_KEY
      }
    });
    // Асинхронне збереження відповіді локально
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during GET request:', error);
  }
})();