Vectorizer.AI は、本格的なビットマップトレーシング API です。 API は、全自動で、クラス最高の忠実度をもって、ピクセルからベクターへトレースします。
ビットマップ画像を POST して、ベクター化された結果を受け取ります。
$ curl https://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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://ja.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 統合の手助けとして、カスタム ChatGPT を作成しました。 API ドキュメントに関する質問に答え、ユーザーの事例に合わせたサンプルコードをご希望の言語で提供することができます。
Vectorizer.AI API チャットボットによるチャットを利用する
チャットボットはベータ運営中であり、間違いを起こすことがあります。 回答を再確認し、間違いや欠落部を修正するよう質問を重ねて改訂させてください。
API は、多くの様々なユースケースに対応できるよう設計されています。 以下は、その中でも一般的な例です。
ベクター化エンドポイントと上記のコードサンプルを使用します。
販売前に多くの API コールを行わなければならない場合、見込み客を顧客に転換するまで低コストのプレビューを利用することができます。
Vectorizer エンドポイントおよび 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 応答ヘッダーで返される画像トークンを保管しておいてください。
ベクター化エンドポイントと画像トークンを使って、必要な残りの処理オプションを繰り返し適用します。
他の方法としては、各画像を個別に処理し、画像トークンを使用しないこともできます。 画像トークンを使用すると、若干の処理能力と遅延を節減することができます。
| 操作 | クレジット | 説明 |
|---|---|---|
| テスト | 0.000 |
API の統合およびテストは無料で、サブスクリプションは不要です。
開発には、 最初のページのインタラクティブウェブアプリを使って、結果の品質を評価することができます。 |
| プレビュー | 0.200 |
エンドユーザーに対し、購入前に見せることができるプレビュー結果も提供されています。 プレビューは、入力より 4 倍大きい PNG 画像で、目立たない透かしが入っています。
プレビュー結果を得るには、 |
| ベクター化 | 1.000 | ビットマップ画像をベクター化して、ベクター画像にします。 |
| アップグレードプレビュー | 0.900 | プレビュー API コールの後、運用版の結果をダウンロードします。 最初からベクター化することに比べ、割引となります。 |
| ダウンロード形式 | 0.100 | 結果の別形式(SVG、PNG、PDF など)をダウンロードします。 最初からベクター化することに比べ、割引となります。 |
| ストレージ日 | 0.010 | 無料の初日の後、結果を保管する場合の 1 日当たりの価格。 |
サブスクリプション料金表については、価格ページを参照してください。
API は、標準の HTTP 基本アクセス認証を使用します。 API に対するすべてのリクエストは、HTTPS で行い、API Id をユーザーとして、API シークレットをパスワードとする API 資格情報を含める必要があります。
リクエストを正しく行うには、http クライアントライブラリは、サーバー名表示(SNI) に対応している必要があります。 おかしなハンドシェークエラーが発生する場合、大抵これが原因となっています。
API の利用にはレート制限がありますが、割当量には余裕があり、固定された上限値があるわけではありません。
通常のエンドユーザー操作では使用方法に緩急があるのが常なので、ユーザー側で帯域制限を意識することはなく、サービスは円滑に処理されます。
ただし、バッチジョブでは最大 5 スレッドから始め、お望みの並列処理数に達するまで 5 分ごとに 1 新規スレッドを追加することをお奨めします。 100 同時スレッドを超える処理を必要とする場合は、作業開始前にご連絡ください。
あまりにも多くのリクエストを提出すると、429 Too Many Requestsのレスポンスが返されます。 これが発生したら、リニアバックオフを適用してください。すなわち、最初のレスポンスが返った後、次のリクエストの提出まで 5 秒間待ちます。 引き続き 2 回目の 429 レスポンス発生の場合、次のリクエストの提出まで 2*5=10 秒間待ちます。 3 回目は、 3*5=15 秒待ちます(以下同様)。
バックオフカウンターは、リクエストが正しく完了した後リセットできます。バックオフはスレッドごとに適用してください(すなわち、スレッドは相互に独立に操作する)。
API リクエストは通常数秒以内に完了しますが、一時的に過負荷状況が発生すると、より長い処理時間が必要になる可能性があります。
クライアントライブラリが、API リクエストを早期終了しないよう、これはアイドルタイムアウトを 180 秒以上とするように設定すべきです。
当社は、API リクエストの成功または失敗を示すのに、従来の HTTP ステータスを使用し、返されるエラー 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/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。 小数の可能性もあります。倍精度浮動小数点数で取り扱うようにしてください。 |
ユーザー名 = API Id、パスワード = API シークレット
cURL
$ curl "https://api.vectorizer.ai/api/v1/account" \ -u vkyc67kqa27yidd:[secret]
応答の例
{
"subscriptionPlan" : "none",
"subscriptionState" : "ended",
"credits" : 0
}
| 日付 | 変更 |
|---|---|
| 2024/11/04 |
processing.shapes.min_area_px を追加。
|
| 2024/10/01 | API との統合を支援するため、AI チャットボットを追加。 |
| 2024/09/23 | より多くの動作モードを可能とするよう API が大幅に拡充されました。 画像トークン、レシート、コールごとの課金ヘッダー、エンドポイントのダウンロードおよび削除が追加されました。 |
| 2024/06/11 |
processing.palette を追加しました
|
| 2024/03/04 | タイムアウトに関するセクションを追加。 |
| 2024/01/24 | アカウントステータスエンドポイントを追加しました。 最近の API エラーをアカウントページに追加しました。 すべての API エラー応答リストを追加しました。 |
| 2024/01/16 | エラー JSON オブジェクトを文書化しました。 |
| 2023/10/03 |
output.gap_filler.enabled=true では、processing.max_colors でリクエストされた場合より、結果により多くの色が含まれることを明確化。
|
| 2023/09/20 |
mode を追加
|
| 2023/08/01 |
フル機能の出力サイズオプショングループとして、次のオプションを追加しました。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 ビットマップオプショングループとして次の 1 つのオプションを追加しました。output.bitmap.anti_aliasing_mode。
|
| 2023/06/07 |
processing.max_colors を追加
|
| 2023/05/31 | API パラメータを大幅に拡張。 API エンドポイントを更新。 |
| 2023/03/10 | 初回のリリース。 |