API Pixian для удаления фона изображения

Pixian.AI предлагает полноценный API для удаления фона изображения. API удаляет фон изображения полностью автоматически и с лучшей в своем классе точностью.

Получить ключ API

Быстрый старт

Сделайте запрос POST на растровое изображение и получите результат с удаленным фоном:

$ curl https://api.pixian.ai/api/v2/remove-background \
 -u xyz123:[secret] \
 -F image=@example.jpeg \
 -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://api.pixian.ai/api/v2/remove-background")
   .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
   .body(
      MultipartEntityBuilder.create()
         .addBinaryBody("image", new File("example.jpeg")) // TODO: Replace with your image
         // TODO: Add more upload parameters here
         .build()
      );
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();

if (response.getCode() == 200) {
   // Write result to disk, TODO: or wherever you'd like
   try (FileOutputStream out = new FileOutputStream("pixian_result.png")) {
      response.getEntity().writeTo(out);
   }
} else {
   System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
   client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
   form.Add(new ByteArrayContent(File.ReadAllBytes("example.jpeg")), "image", "example.jpeg"); // TODO: Replace with your image
   // TODO: Add more upload parameters here

   var response = client.PostAsync("https://api.pixian.ai/api/v2/remove-background", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None);
      response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
   }
   else
   {
       Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
   }
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');

request.post({
  url: 'https://api.pixian.ai/api/v2/remove-background',
  formData: {
    image: fs.createReadStream('example.jpeg'), // TODO: Replace with your image
    // TODO: Add more upload options here
  },
  auth: {user: 'xyz123', pass: '[secret]'},
  followAllRedirects: true,
  encoding: null
}, function(error, response, body) {
  if (error) {
    console.error('Request failed:', error);
  } else if (!response || response.statusCode != 200) {
    console.error('Error:', response && response.statusCode, body.toString('utf8'));
  } else {
    // Save result
    fs.writeFileSync("pixian_result.png", body);
  }
});
$ch = curl_init('https://api.pixian.ai/api/v2/remove-background');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
      'image' => curl_file_create('example.jpeg'),
      // TODO: Add more upload options here
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
  // Save result
  file_put_contents("pixian_result.png", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://api.pixian.ai/api/v2/remove-background',
    files={'image': open('example.jpeg', 'rb')},
    data={
        # TODO: Add more upload options here
    },
    auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
    # Save result
    with open('pixian_result.png', 'wb') as out:
        out.write(response.content)
else:
    print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'

client = HTTPClient.new default_header: {
  "Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}

response = client.post("https://api.pixian.ai/api/v2/remove-background", {
  "image" => File.open("example.jpeg", "rb"), # TODO: Replace with your image
  # TODO: Add more upload parameters here
})

if response.status == 200 then
  # Write result to disk, TODO: or wherever you'd like
  File.open("pixian_result.png", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
$ curl https://api.pixian.ai/api/v2/remove-background \
 -u xyz123:[secret] \
 -F 'image.url=https://example.com/example.jpeg' \
 -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://api.pixian.ai/api/v2/remove-background")
   .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
   .body(
      MultipartEntityBuilder.create()
         .addTextBody("image.url", "https://example.com/example.jpeg") // TODO: Replace with your image URL
         // TODO: Add more upload parameters here
         .build()
      );
ClassicHttpResponse response = (ClassicHttpResponse) request.execute().returnResponse();

if (response.getCode() == 200) {
   // Write result to disk, TODO: or wherever you'd like
   try (FileOutputStream out = new FileOutputStream("pixian_result.png")) {
      response.getEntity().writeTo(out);
   }
} else {
   System.out.println("Request Failed: Status: " + response.getCode() + ", Reason: " + response.getReasonPhrase());
}
using (var client = new HttpClient())
using (var form = new MultipartFormDataContent())
{
   client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "INSERT_API_KEY_HERE");
   form.Add(new StringContent("https://example.com/example.jpeg"), "image.url"); // TODO: Replace with your image URL
   // TODO: Add more upload parameters here

   var response = client.PostAsync("https://api.pixian.ai/api/v2/remove-background", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("pixian_result.png", FileMode.Create, FileAccess.Write, FileShare.None);
      response.Content.CopyToAsync(outStream).ContinueWith((copyTask) => { outStream.Close(); });
   }
   else
   {
       Console.WriteLine("Request Failed: Status: " + response.StatusCode + ", Reason: " + response.ReasonPhrase);
   }
}
// Requires "request" to be installed (see https://www.npmjs.com/package/request)
var request = require('request');
var fs = require('fs');

request.post({
  url: 'https://api.pixian.ai/api/v2/remove-background',
  formData: {
    'image.url': 'https://example.com/example.jpeg', // TODO: Replace with your image
    // TODO: Add more upload options here
  },
  auth: {user: 'xyz123', pass: '[secret]'},
  followAllRedirects: true,
  encoding: null
}, function(error, response, body) {
  if (error) {
    console.error('Request failed:', error);
  } else if (!response || response.statusCode != 200) {
    console.error('Error:', response && response.statusCode, body.toString('utf8'));
  } else {
    // Save result
    fs.writeFileSync("pixian_result.png", body);
  }
});
$ch = curl_init('https://api.pixian.ai/api/v2/remove-background');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
      'image.url' => 'https://example.com/example.jpeg',
      // TODO: Add more upload options here
    ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$data = curl_exec($ch);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) {
  // Save result
  file_put_contents("pixian_result.png", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://api.pixian.ai/api/v2/remove-background',
    data={
        'image.url': 'https://example.com/example.jpeg',
        # TODO: Add more upload options here
    },
    auth=('xyz123', '[secret]')
)
if response.status_code == requests.codes.ok:
    # Save result
    with open('pixian_result.png', 'wb') as out:
        out.write(response.content)
else:
    print("Error:", response.status_code, response.text)
# Requires: gem install httpclient
require 'httpclient'

client = HTTPClient.new default_header: {
  "Authorization" => "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}

response = client.post("https://api.pixian.ai/api/v2/remove-background", {
  "image.url" => "https://example.com/example.jpeg", # TODO: Replace with your image URL
  # TODO: Add more upload parameters here
})

if response.status == 200 then
  # Write result to disk, TODO: or wherever you'd like
  File.open("pixian_result.png", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end

Мигрируете из другого провайдера? Check out our migration guide

Цены

Интеграция и тестирование API бесплатны, оплата не требуется.

Просто используйте test=true для разработки. Оценить качество результата можно с помощью интерактивного веб-приложения на главной странице.

Производственные результаты требуют покупки пакета кредитов. Смотрите страницу расценок.

Аутентификация и безопасность

API использует стандартную аутентификацию основного доступа HTTP. Все запросы к API должны выполняться через HTTPS и включать ваши учетные данные API с вашим идентификатором пользователя API и секретом API в качестве пароля.

Для успешного выполнения запросов Ваша клиентская библиотека http должна поддерживать указание имени сервера (SNI). Если вы получаете странные ошибки подтверждения, скорее всего, проблема именно в этом.

Ограничение скорости

Использование API ограничено по скорости с щедрыми надбавками и без жесткого верхнего предела.

Во время нормальной работы конечного пользователя вы вряд ли столкнетесь с каким-либо ограничением скорости, поскольку потребление в таком случае то возрастает, то снижается, с чем сервис хорошо справляется.

Однако для пакетных заданий мы рекомендуем начинать не более, чем с 5 потоков, добавляя по 1 новому потоку каждые 5 минут, пока вы не достигнете желаемого уровня параллелизма. Пожалуйста, свяжитесь с нами перед началом работы, если вам нужно более 100 одновременных потоков.

Если вы направите слишком много запросом, вы начнете получать отклики 429 Too Many Requests. Когда это произойдет, вы должны применить линейную выдержку: при первом таком отклике подождите 5 секунд перед отправлением следующего запроса. При втором последовательном отклике 429 подождите 2*5=10 секунд перед отправлением следующего запроса. При третьем подождите 3*4=15 секунд и т.д.

Счетчик выдержки можно сбросить после успешного запроса, а выдержку нужно применять отдельно для каждого потока (т.е. потоки должны работать независимо друг от друга).

Тайм-ауты

Хотя запросы API обычно выполняются в течение нескольких секунд, во время временных пиковых нагрузок время обработки может увеличиться.

Чтобы ваша клиентская библиотека не прерывала преждевременно запросы API, ее следует настроить с тайм-аутом простоя не менее 180 секунд.

JSON объект ошибки

Мы используем обычные статусы HTTP для указания выполнения или невыполнения запроса API и включаем важную информацию об ошибке в направляемый JSON объект ошибки.

Мы стремимся всегда указывать JSON объект ошибки для любого невыполненного запроса. Однако теоретически всегда возможны внутренние сбои сервера, которые приводят к отклику об ошибке не в формате JSON.

Атрибуты

statusСтатус HTTP отклика, повторяется для оказания помощи в отладке.
codeВнутренний код ошибки Pixian.AI.
messageСообщение об ошибке в понятном для человека формате для помощи в отладке.

Если статус HTTP для вашего запроса равен 200, вы не получите JSON объекта ошибки и можете с уверенностью предположить, что запрос в целом выполнен успешно.

Некоторые клиентские библиотеки HTTP вызывают исключения для статусов HTTP в диапазоне 400-599. Вам нужно будет перехватить эти исключения и обработать их соответствующим образом.

HTTP StatusЗначение
200-299

Успешно выполнено

400-499

Возникла проблема с информацией, предоставленной в запросе (например, отсутствует параметр). Пожалуйста, прочитайте сообщение об ошибке, чтобы узнать, как ее исправить.

500-599

Произошла внутренняя ошибка Pixian.AI. Подождите немного, а затем попробуйте еще раз, и, если проблема не исчезнет, отправьте нам сообщение.

Пример сообщения об ошибке

{
  "error" : {
    "status" : 400,
    "code" : 1006,
    "message" : "Failed to read the supplied image. "
  }
}

Формат Delta PNG Меньшая задержка и пропускная способность

Pixian.AI гордится тем, что является первой службой удаления фона, предлагающей результат в формате Delta PNG. Delta PNG кодируются быстрее, и они намного меньше обычных PNG. Поэтому они их хорошо подходят для приложений, чувствительных к задержке и пропускной способности, таких как мобильные приложения.

Дополнительные сведения Стрелка вправо

Удалить фон POST
https://api.pixian.ai/api/v2/remove-background

Чтобы удалить фон изображения, вы выполняете стандартную загрузку файла HTTP POST. Помните, что при загрузке двоичных файлов Content-Type должен быть multipart/form-data .

Параметры

Входное изображение должно иметь быть представлено одним из следующих вариантов:


Двоичный

Двоичный файл.


Строка

Строка в кодировке base64. Строка может иметь размер не более 1 мегабайта.


Строка

URL-адрес для получения и обработки.

Должно быть файлом в формате .bmp, .gif, .jpeg, .png или .tiff.

Максимальный размер загружаемого изображения (= ширина × высота) составляет 32 000 000 пикселей, что сокращается до max_pixels.


Логическое значение, по умолчанию: false

Передайте true, чтобы указать, что это тестовое изображение.

Пропустите код или передайте false для рабочих изображений.

Тестовые изображения можно обрабатывать бесплатно, но на результате будет внедренный водяной знак.


Целое число, от 100 до 25000000, по умолчанию: 25000000

Максимальный размер входного изображения (= ширина × высота). Изображения большего размера будут уменьшены до этого размера перед обработкой.


Формат: '#RRGGBB', например, #0055FF

Цвет фона, который будет применен к результату. Пропустите, чтобы оставить прозрачный фон.

Обязательно укажите префикс '#'.


Логическое значение, по умолчанию: false

Обрезать ли результат до объекта переднего плана.

Очень полезно использовать вместе с result.margin и result.target_size, чтобы каждый раз получать результат хорошего размера, расположенный по центру.


Формат: '(x.y%|px){1,4}', например. 10px 20% 5px 15%, по умолчанию: 0px

Поле, которое будет добавлено к результату.

Он добавляется независимо от того, обрезан ли результат до переднего плана или нет.

Если указан result.target_size, то поле вставляется, т. е. оно не увеличивает эффективный целевой размер.

Поддерживаемые единицы - % и px. Он соответствует семантике CSS, поэтому вы можете использовать любое из следующего:

  • [all]
  • [top/bottom] [left/right]
  • [top] [left/right] [bottom]
  • [top] [right] [bottom] [left]


Формат: 'w h', например, 1920 1080

Установите определенный размер результата в пикселях. Результат будет масштабирован в соответствии с указанным размером. При наличии лишнего пространства оно всегда центрируется по горизонтали, при этом result.vertical_alignment управляет вертикальной обработкой.


Перечисление, по умолчанию: middle

Указывает, как выделить лишнее вертикальное пространство при использовании result.target_size.


Перечисление, по умолчанию: auto

Выходной формат. auto интерпретируется как png для прозрачных результатов, а jpeg для непрозрачных результатов, т. е. когда был указан background.color.

delta_png — это усовершенствованный, быстрый и очень компактный формат, особенно полезный для ситуаций с низкой задержкой и ограниченной полосой пропускания, таких как мобильные приложения. Он кодирует фон как прозрачный черный 0x00000000, а передний план — как прозрачный белый 0x00FFFFFF. Частично прозрачные пиксели имеют свои фактические значения цвета. Вместе с входным изображением вы можете использовать это для восстановления полного результата. Learn more about the Delta PNG format

background.color, result.crop_to_foreground, result.margin, result.target_size и result.vertical_alignment игнорируются при использовании delta_png. Результат должен быть того же размера, что и входное изображение, иначе декодирование завершится неудачно, поэтому max_pixels не должен вызывать сжатия входных данных.


Целое число, от 1 до 100, по умолчанию: 75

Качество, используемое при кодировании результатов в JPEG.

Заголовки результатов

X-Credits-Charged Фактически начисленные кредиты.
X-Credits-Calculated Рассчитанные кредиты, которые были бы начислены, если бы это был производственный запрос. Возвращается только для тестовых запросов.
X-Input-Orientation Тег ориентации EXIF, который мы прочитали из входного изображения и применили к нему. Это целое число от 1 до 8 включительно. Это полезно, если ваша библиотека загрузки изображений не поддерживает ориентацию EXIF. Read more about EXIF orientation here
X-Input-Size [width] [height] входного изображения в пикселях до применения каких-либо ограничений размера.
X-Result-Size [width] [height] изображения-результата в пикселях.
X-Input-Foreground [top] [left] [width] [height] ограничивающая рамка переднего плана в координатах входного изображения.
X-Result-Foreground [top] [left] [width] [height] ограничивающая рамка переднего плана в координатах изображения-результата.

Журнал изменений API

ДатаИзменить
4 мар. 2024 г. Добавлен раздел про тайм-ауты.
16 янв. 2024 г. Задокументирован объект ошибки JSON.
11 янв. 2024 г. В настоящее время мы фактически возвращаем заголовок X-Credits-Charged и добавили заголовок X-Credits-Calculated для тестовых запросов.
13 июн. 2023 г. API обновлен до версии 2, а параметры с CamelCase на Snake_case для более удобного чтения. Предыдущая версия API устарела, но все еще доступна.
3 мая 2023 г. Значительно расширены параметры API.
28 апр. 2023 г. Обновлена конечная точка API.
21 мар. 2023 г. Изначальный выпуск.
Получить ключ API