Vectorizer.AI предлагает полноценный 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
Мы создали специальный ChatGPT, который поможет вам с интеграцией API. Он может ответить на вопросы по документации API и предоставить пример кода на предпочитаемом вами языке, адаптированный под ваш вариант использования.
Чат с чат-ботом API Vectorizer.AI
Чат-бот находится в стадии бета-тестирования и допускает ошибки. Еще раз проверьте ответы и попросите пересмотреть код, чтобы исправить ошибки и пропуски.
API разработан для поддержки множества различных вариантов использования. Вот некоторые из наиболее распространенных:
Используйте конечную точку Векторизировать и примеры кода, указанные выше.
Если для совершения продажи вам необходимо много раз вызывать API, вы можете использовать более дешевые предварительные просмотры до тех пор, пока вы не убедите клиента окончательно.
Используйте конечную точку Векторизировать с mode=preview
и policy.retention_days > 0
для получения предварительного просмотра, обязательно сохранив токен изображения, возвращаемый в заголовке ответа X-Image-Token
.
После преобразования используйте конечную точку Скачать с токеном изображения, чтобы скачать полный результат.
Дополнительно: если вам нужны дополнительные форматы результатов (например, PNG, PDF и т.д.), обязательно сохраните квитанцию, возвращенную в заголовке ответа скачивания X-Receipt
. Затем используйте конечную точку Скачать с токеном изображения и квитанцией для загрузки оставшихся форматов.
Используйте конечную точку Векторизировать с policy.retention_days > 0
, чтобы получить первый результат, при этом обязательно сохраните токен изображения, возвращенный в заголовке ответа X-Image-Token
.
Используйте конечную точку Скачать с токеном изображения для скачивания других форматов.
Используйте конечную точку Векторизировать с policy.retention_days > 0
, чтобы получить первый результат, при этом обязательно сохраните токен изображения, возвращенный в заголовке ответа X-Image-Token
.
Используйте конечную точку Векторизировать с токеном изображения для итерации оставшихся необходимых вам параметров обработки.
Как вариант, вы можете обрабатывать каждое изображение отдельно и не беспокоиться о токене изображения. Image Token экономит вам часть пропускной способности и задержек.
Действие | Кредиты | Описание |
---|---|---|
Тестирование | 0.00 |
Интеграция и тестирование API бесплатны, подписка не требуется.
Используйте Оценить качество результата можно с помощью интерактивного веб-приложения на главной странице. |
Просмотр | 0.20 |
Мы также предлагаем результаты просмотра, которые вы можете показать своим конечным пользователям, прежде чем они совершат покупку. Просмотр представляет собой PNG-изображение, которое в четыре раза больше вашего оригинала и снабжено незаметным водяным знаком.
Чтобы получить результат просмотра, используйте |
Векторизация | 1.00 | Векторизируйте растровое изображение в векторное. |
Просмотр обновлений | 0.90 | Скачайте результат работы после предварительного вызова API. Скидка по сравнению с векторизацией с нуля. |
Формат скачивания | 0.10 | Скачайте другой формат результата (например, SVG, PNG, PDF и т.д.). Скидка по сравнению с векторизацией с нуля. |
День хранения | 0.01 | Цена за день хранения результата после первого бесплатного дня. |
Планы подписки можно найти на странице цен.
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 секунд.
Мы используем обычные статусы 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.
Вот настраиваемые заголовки ответов, которыми мы пользуемся:
Заголовок | Описание |
---|---|
X-Image-Token
|
Возвращается, если ваш запрос на векторизацию содержит
|
X-Receipt
|
Возвращается при скачивании результата работы с использованием токена изображения предварительного просмотра. Может использоваться для скачивания дополнительных форматов (например, SVG, PNG, PDF и т.д.) результата по цене скачивания формата вместо цены предварительного просмотра обновления. |
X-Credits-Calculated
|
Возвращается с тестовыми запросами, чтобы показать стоимость в случае, если бы это был обычный запрос. |
X-Credits-Charged
|
Возвращается со всеми запросами на просмотр расходов. Всегда 0 для тестовых запросов. |
POST
https://api.vectorizer.ai/api/v1/vectorize
Чтобы векторизировать изображение, вы выполняете стандартную загрузку файла HTTP POST. Помните, что при загрузке двоичных файлов Content-Type должен быть multipart/form-data
.
В приведенной ниже таблице представлены все параметры API в рабочей форме для пробного использования. Каждый параметр имеет краткое описание, но не забудьте ознакомиться с подробной документацией по параметрам вывода.
POST
https://api.vectorizer.ai/api/v1/download
Эта конечная точка позволяет вам:
Скачивайте полный результат работы после вызова API предварительного просмотра.
Мы включаем в ответ заголовок X-Receipt
, чтобы впоследствии вы могли скачивать дополнительные выходные форматы по сниженной цене скачивания форматов.
Загружайте несколько выходных форматов для одного и того же изображения и параметров обработки по сниженной цене и без необходимости векторизации их всех с нуля.
POST
https://api.vectorizer.ai/api/v1/delete
Векторизованные с помощью policy.retention_days > 0
изображения сохраняются в течение запрошенного периода времени, а после этого быстро удаляются автоматически.
Обычно нет необходимости вызывать эту конечную точку. Она предоставляется для того, чтобы вы могли удалить изображения до истечения срока хранения. Досрочное удаление изображения не повлечет за собой возврат средств за оставшиеся дни хранения.
Атрибуты отклика |
|
---|---|
success |
|
Пример отклика
{ "success" : true }
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 vkyc67kqa27yidd:[secret]
Пример отклика
{ "subscriptionPlan" : "none", "subscriptionState" : "ended", "credits" : 0 }
Дата | Изменить |
---|---|
4 нояб. 2024 г. |
Добавлен processing.shapes.min_area_px .
|
1 окт. 2024 г. | Добавлен чат-бот на основе ИИ для упрощения интеграции с API. |
23 сент. 2024 г. | Значительно расширен API для поддержки большего количества режимов работы. Добавлены токены изображений, квитанции, заголовки оплаты за вызов, а также конечные точки скачивания и удаления. |
11 июн. 2024 г. |
Добавили processing.palette
|
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 г. | Изначальный выпуск. |