사진에서 얼굴과 번호판을 흐리게 처리하는 REST API

Watermarkly Blur API는 이미지에서 자동차 번호판과 얼굴을 자동으로 감지하고 흐리게 처리합니다.

이미지에서 얼굴과 번호판을 흐리게 처리하는 API

이 서비스는 AWS 인프라에서 완전히 호스팅되며, 고객 파일을 AI 모델 학습에 사용하지 않아 개인 정보 보호를 보장합니다.
AWS Lambda를 사용하여 수천 개의 동시 요청을 안정적으로 처리하고 전 세계 여러 지역에서 서비스를 제공합니다.

기능

  • 이미지에서 자동차 번호판과 얼굴을 자동으로 감지하고 흐리게 처리합니다.
  • 자동차 번호판을 프로젝트 로고로 교체할 수 있습니다.
  • 처리된 이미지를 크기 조정, 자르기 또는 변환할 수 있습니다.
  • 초당 최대 500개 요청을 지원합니다.
  • 병렬 처리를 통해 빠른 성능을 제공합니다.
  • 최대 지원 이미지 크기: 6000x6000 픽셀.

더 빠른 처리 속도, 더 큰 이미지 지원 또는 높은 요청 속도가 필요하면 api-support@watermarkly.com으로 문의하십시오.

API를 사용하면 자동차 번호판을 회사 로고로 교체할 수 있습니다.

이미지에서 얼굴과 번호판을 흐리게 처리하는 API

API 엔드포인트

지역

현재, API는 두 개의 지역에서 제공됩니다:

편리한 엔드포인트를 자유롭게 사용하실 수 있습니다. AWS 지역이 다운될 경우, 두 번째 엔드포인트를 백업으로 사용할 수 있습니다. 다른 지역에서 API가 필요하면 알려주세요.

요청 방법

이미지를 처리하려면 GET 또는 POST 요청을 사용할 수 있습니다.
이미지가 공개적으로 접근 가능하다면 GET 요청을 권장합니다. GET 요청이 POST 요청보다 약간 더 빠릅니다.

GET 요청을 사용하여 이미지 블러 처리 (권장)

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

or

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

서비스가 image_url에서 이미지를 다운로드하고 처리합니다.

요청

  • 메서드: GET
  • 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 또는 데이터 URL일 수 있습니다. 요청 매개변수로 전달하기 전에 URL이 올바르게 인코딩되었는지 확인하십시오.
    • logo_size (선택 사항): 0.1에서 1.0 사이의 숫자로 로고 크기를 지정합니다.
    • plate_screws (선택 사항): 번호판에 나사를 추가합니다. logo_url 매개변수와 함께 사용해야 합니다.

응답

성공적인 응답: (HTTP Status: 200) 서비스는 JPEG, PNG, WEBP 형식 중 하나로 처리된 이미지를 반환합니다.

오류 응답: (HTTP Status: 500, 403)

{
  "message": "Error message"
}

POST 요청을 사용하여 이미지 블러 처리

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

or

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 또는 데이터 URL을 사용할 수 있습니다. URL을 요청 매개변수로 전달하기 전에 올바르게 인코딩되었는지 확인하세요.
    • logo_size (선택 사항): 0.1 ~ 1.0 사이의 숫자로 로고 크기를 지정합니다.
    • plate_screws (선택 사항): 번호판에 나사를 추가합니다. logo_url 매개변수와 함께 사용해야 합니다.

응답

성공적인 응답: (HTTP Status: 200) 서비스는 JPEG, PNG, WEBP 형식 중 하나로 처리된 이미지를 반환합니다.

오류 응답: (HTTP Status: 500, 403)

{
  "message": "Error message"
}

처리 세부 정보

  • 처리된 이미지는 서버에 저장되지 않습니다.
  • 이 서비스는 JPEG, PNG, WEBP, AVIF, HEIC/HEIF 형식의 이미지를 지원합니다.
  • AVIFHEIF 이미지는 다른 형식이 지정되지 않는 한 JPEG로 변환됩니다.
  • 최대 입력 이미지 크기:
    • GET 요청: 20MB 또는 6000x6000 픽셀.
    • POST 요청: 6MB 또는 6000x6000 픽셀.
  • API 요청 제한:
    • 동시 요청 500개
    • 초당 500개 요청
    • 하루 100,000개 요청
  • 더 높은 제한이 필요하면 api-support@watermarkly.com으로 문의하세요.

보안 및 개인정보 보호

  • API 요청은 API 키를 통한 인증이 필요합니다.
  • 고객 파일은 AI 모델 학습에 사용되지 않습니다.
  • 모든 처리는 AWS 인프라에서 이루어집니다. 원하는 지역에 API를 무료로 배포할 수 있습니다.

사용 예시

Python

import requests
import urllib.parse

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

input_path = ''       # Local image path
output_path = ''      # Local output path

# Blur image using POST request
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 rate limit exceeded, wait a little
        time.sleep(0.1)
        response = requests.post(API_URL, headers={'x-api-key': API_KEY}, data=image_file)
# Save the processed image locally
with open(output_path, 'wb') as f:
    f.write(response.content)


# Blur image using GET request
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})
# Save the response locally
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/';

// Helper function to pause execution for the given number of milliseconds
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

(async () => {
  // Blur image using POST request
  try {
    const inputPath = 'input_path_here';   // Replace with your actual input path
    const outputPath = 'output_path_here'; // Replace with your actual output path

    // Read image file as binary data asynchronously
    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 rate limit exceeded, wait a little
      await sleep(100); // sleep for 0.1 seconds
      response = await fetch(API_URL, {
        method: 'POST',
        headers: {
          'x-api-key': API_KEY,
          'Content-Type': 'application/octet-stream'
        },
        body: imageData
      });
    }
    // Save the processed image locally asynchronously
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during POST request:', error);
  }

  // Blur image using GET request
  try {
    const outputPath = 'output_path_here'; // Replace with your actual output path
    const encodedUrl = encodeURIComponent("https://nikitin.io/eqe.jpg"); // Encode URL
    const response = await fetch(`${API_URL}?url=${encodedUrl}`, {
      method: 'GET',
      headers: {
        'x-api-key': API_KEY
      }
    });
    // Save the response locally asynchronously
    const arrayBuffer = await response.arrayBuffer();
    const buffer = Buffer.from(arrayBuffer);
    await fs.writeFile(outputPath, buffer);
  } catch (error) {
    console.error('Error during GET request:', error);
  }
})();