API векторизации изображений

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

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

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

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

$ curl https://ru.vectorizer.ai/api/v1/vectorize \
 -u xyz123:[secret] \
 -F image=@example.jpeg \
 -o result.svg
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://ru.vectorizer.ai/api/v1/vectorize")
   .addHeader("Authorization", "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd")
   .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("result.svg")) {
      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://ru.vectorizer.ai/api/v1/vectorize", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("result.svg", 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://ru.vectorizer.ai/api/v1/vectorize',
  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("result.svg", body);
  }
});
$ch = curl_init('https://ru.vectorizer.ai/api/v1/vectorize');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'));
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("result.svg", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Either use the sample code below, or this SDK: https://pypi.org/project/vectorizer-ai/
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://ru.vectorizer.ai/api/v1/vectorize',
    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('result.svg', '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 dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd"
}

response = client.post("https://ru.vectorizer.ai/api/v1/vectorize", {
  "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("result.svg", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
$ curl https://ru.vectorizer.ai/api/v1/vectorize \
 -u xyz123:[secret] \
 -F 'image.url=https://example.com/example.jpeg' \
 -o result.svg
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://ru.vectorizer.ai/api/v1/vectorize")
   .addHeader("Authorization", "Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd")
   .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("result.svg")) {
      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://ru.vectorizer.ai/api/v1/vectorize", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("result.svg", 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://ru.vectorizer.ai/api/v1/vectorize',
  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("result.svg", body);
  }
});
$ch = curl_init('https://ru.vectorizer.ai/api/v1/vectorize');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'));
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("result.svg", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Either use the sample code below, or this SDK: https://pypi.org/project/vectorizer-ai/
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://ru.vectorizer.ai/api/v1/vectorize',
    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('result.svg', '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 dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd"
}

response = client.post("https://ru.vectorizer.ai/api/v1/vectorize", {
  "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("result.svg", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end

Цены

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

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

Результаты производства требуют подписки, и каждый стоит 1,00 кредит.

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

Просмотр представляет собой PNG-изображение в четыре раза больше вашего оригинала, которое снабжено незаметным водяным знаком и стоит 0,20 кредитов.

Чтобы получить результат просмотра, просто используйте mode=preview.

Планы подписки можно найти на странице цен.

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

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Внутренний код ошибки Vectorizer.AI.
messageСообщение об ошибке в понятном для человека формате для помощи в отладке.

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

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

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

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

400-499

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

500-599

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

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

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

Недавние ошибки API перечислены на странице вашей учетной записи для удобства отладки.

Также имеется список всех ответов об ошибках, возвращаемых API.

Векторизация POST
https://api.vectorizer.ai/api/v1/vectorize

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

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

Параметры

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


Двоичный

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


Строка

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


Строка

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

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

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


Перечисление, по умолчанию: production
Value Processing Mode Credits
production

Этот режим предназначен для производственного использования, поддерживаются все параметры.

1.00
preview

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

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

0.20
test

Этот режим предназначен для использования разработчиками при интеграции с сервисом. Поддерживаются все параметры, но есть значительные водяные знаки.

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

Бесплатно

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

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


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

Максимальное количество цветов, используемых для результата.

0 означает без ограничений. И 1 и 2 означают два цвета, например, черный и белый. N>=2 означает это количество цветов.

Обратите внимание: если output.gap_filler.enabled=true (по умолчанию), результат также будет содержать смеси выбранных цветов. Отключите заполнитель пробелов, чтобы получить результат только с выбранными цветами.


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

Формат выходного файла.

Параметры SVG:


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

Укажите атрибут версии SVG в теге SVG. Подробнее


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

Включать ли атрибуты размера изображения в тег SVG. Если значение true, как правило, зрители будут отображать SVG с фиксированным размером. Если значение false, зрители обычно позволяют масштабировать SVG в соответствии с доступным пространством. Подробнее


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

Если значение true, мы отключаем опции, которые Adobe Illustrator не может импортировать. Подробнее

Параметры DXF:


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

Считыватели DXF сильно различаются по своим возможностям. Эта опция позволяет вам ограничить вывод примитивами чертежа, которые фактически поддерживает ваш DXF-ридер. Подробнее

Параметры растрового изображения:


Перечисление, по умолчанию: anti_aliased
Value Anti-Aliasing Mode
anti_aliased Цвета пикселей вдоль границы между фигурами смешиваются в соответствии с долей площади пикселя, покрываемой каждой фигурой.
aliased Пикселям присваивается цвет фигуры, содержащей геометрический центр пикселя.

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

Укажите, как вы хотите обвести или заполнить вывод. Есть небольшая разница между обводкой фигур и обводкой краев между ними. Пожалуйста, смотрите подробную документацию для объяснения


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

Определяет, размещаются ли фигуры в вырезах фигур ниже (cutouts) или располагаются друг над другом (stacked). Подробнее


Перечисление, по умолчанию: none
Value Shape grouping
none Группировка отсутствует
color По цвету взаимодействует с output.shape_stacking
parent По включению фигуры
layer По порядку отрисовки слоя
Подробнее

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

Сводит идентифицированные круги, эллипсы, прямоугольники, треугольники и звезды к обычным кривым. Подробнее

Кривые:


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

Разрешать ли квадратичные кривые Безье. Подробнее


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

Разрешать ли кубические кривые Безье. Подробнее


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

Разрешать ли дуги окружности. Подробнее


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

Разрешать ли эллиптические дуги. Подробнее


Число с плавающей запятой, от 0.001 до 1.0, по умолчанию: 0.1

Максимальное расстояние в пикселях между кривой и аппроксимирующей ее линией. Подробнее

Заполнитель пробелов:


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

Обходить ли ошибки рендеринга белой линии, распространенные в векторных программах просмотра. Подробнее


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

Обрезать ли штрихи заполнителя пробелов. При значении output.shape_stacking=stacked, либо обрезайте, либо используйте немашсштабируемые штрихи. Подробнее


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

Использовать ли немасштабируемые штрихи заполнителя пробелов. При значении output.shape_stacking=stacked, либо обрезайте, либо используйте немашсштабируемые штрихи. Подробнее


Число с плавающей запятой, от 0.0 до 5.0, по умолчанию: 2.0

Ширина штрихов заполнителя пробелов. Подробнее

Стиль обводки, когда output.draw_style равен stroke_shapes или stroke_edges


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

Использовать ли немасштабируемый штрих. Подробнее


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

Следует ли использовать переопределяемый цвет или предполагаемый цвет фигуры. Подробнее


Формат: '#RRGGBB', например. #FF00FF, по умолчанию: #000000

Замещающий цвет. Подробнее


Число с плавающей запятой, от 0.0 до 5.0, по умолчанию: 1.0

Ширина штриха. Подробнее

Выходной размер:


Число с плавающей запятой, от 0.0 до 1000.0

Единый масштабный коэффициент. Если указан, имеет приоритет над output.size.width и output.size.height.


Число с плавающей запятой, от 0.0 до 1.0E12

Ширина в единицах, заданных output.size.unit. Если указана только ширина или высота, другая вычисляется автоматически, чтобы сохранить соотношение сторон.


Число с плавающей запятой, от 0.0 до 1.0E12

Высота в единицах, заданных output.size.unit. Если указана только ширина или высота, другая вычисляется автоматически, чтобы сохранить соотношение сторон.


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

Единица измерения ширины и высоты. Из них pt, in, cm и mm — это физические единицы, а none и px — нефизические единицы. Эти различия взаимодействуют с output.size.input_dpi и output.size.output_dpi.


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

Значение Правило масштабирования
preserve_inset Масштабируйте равномерно, чтобы вписаться в более узкое измерение, избежать переполнения и иметь пустое пространство в другом измерении.
preserve_overflow Масштабируйте равномерно, чтобы вписаться в менее узкое измерение, перекрывая более узкое измерение.
stretch Неравномерное масштабирование для соответствия указанной ширине и высоте
Для любого варианта preserve положение в неограниченном измерении управляется output.size.align_x или output.size.align_y.


Число с плавающей запятой, от 0.0 до 1.0, по умолчанию: 0.5

Горизонтальное выравнивание для output.size.aspect_ratio = preserve_inset или preserve_overflow.

Значение Горизонтальное выравнивание
0.0 Выравнивание по левому краю
0.5 Центрирование по горизонтали
1.0 Выравнивание по правому краю
Может быть любым значением между 0.0 и 1.0.


Число с плавающей запятой, от 0.0 до 1.0, по умолчанию: 0.5

Выравнивание по вертикали для output.size.aspect_ratio = preserve_inset или preserve_overflow.

Значение Вертикальное выравнивание
0.0 Выравнивание по верхнему краю
0.5 Центрирование по вертикали
1.0 Выравнивание по нижнему краю
Может быть любым значением между 0.0 и 1.0.


Число с плавающей запятой, от 1.0 до 1000000.0

DPI входного изображения считывается из файла, если он доступен. Этот параметр позволяет переопределить это значение. Результирующее значение используется для вычисления физического размера входного изображения, которое используется для вычисления выходного размера, если для выходных данных указаны физические единицы, а не ширина или высота в явном виде.


Число с плавающей запятой, от 1.0 до 1000000.0

DPI выходного изображения. Используется для вычисления размера вывода растрового изображения в пикселях, когда указаны физические единицы измерения.

Статус учетной записи GET
https://api.vectorizer.ai/api/v1/account

Извлеките основную информацию о вашей учетной записи, такую как статус вашей подписки и количество оставшихся кредитов.

Параметры

Нет

Атрибуты отклика

subscriptionPlan

План, на который вы в настоящее время подписаны, или 'отсутствует'.

subscriptionState

Состояние вашей текущей подписки ('активна' или 'просрочена') или 'закончилась', если вы не подписаны.

credits

Количество кредитов API на вашей учетной записи. Если вы в настоящее время не подписаны или подписаны не на план API, то 0. Может быть дробным, поэтому обязательно анализируйте его как Double.

Имя пользователя = идентификатор API, пароль = секрет API

cURL

$ curl "https://api.vectorizer.ai/api/v1/account" \
 -u 123:[secret]

Пример отклика

{
  "subscriptionPlan" : "none",
  "subscriptionState" : "ended",
  "credits" : 0
}

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

ДатаИзменить
4 мар. 2024 г. Добавлен раздел про тайм-ауты.
24 янв. 2024 г. Добавлена конечная точка состояния учетной записи. Добавлены недавние ошибки API на страницу учетной записи. Добавлен список всех ответов об ошибках API.
16 янв. 2024 г. Задокументирован объект ошибки JSON.
3 окт. 2023 г. Уточнено, что output.gap_filler.enabled=true приводит к большему количеству цветов в результате, чем запрошено в processing.max_colors.
20 сент. 2023 г. Добавили mode
1 авг. 2023 г. Добавлена полнофункциональная группа параметров размера вывода со следующими параметрами: output.size.scale, output.size.width, output.size.height, output.size.unit, output.size.aspect_ratio, output.size.align_x, output.size.align_y, output.size.input_dpi и output.size.output_dpi. Добавлена группа параметров вывода растрового изображения с одним параметром: output.bitmap.anti_aliasing_mode.
7 июн. 2023 г. Добавили processing.max_colors
31 мая 2023 г. Значительно расширены параметры API. Обновлена конечная точка API.
10 мар. 2023 г. Изначальный выпуск.
Получить ключ API