画像ベクター化 API

Vectorizer.AI は、本格的なビットマップトレーシング API です。 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 の統合をテストするのは無料です。サブスクリプションは不要です。

開発には、mode=testを使ってください。 最初のページのインタラクティブウェブアプリを使って、結果の品質を評価することができます。

運用版の結果には、サブスクリプションが必要で、それぞれ 1.00 クレジットです。

また、購入前にエンドユーザーに見せることができるプレビュー結果も提供されています。

プレビューは、入力より 4 倍大きい PNG 画像で、目立たない透かしが入っており、それぞれ 0.20 クレジットかかります。

プレビュー結果を得るには、mode=preview を使ってください。

サブスクリプション料金表については、価格ページを参照してください。

認証およびセキュリティ

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 秒以上とするように設定すべきです。

エラー JSON オブジェクト

当社は、API リクエストの成功または失敗を示すのに、従来の HTTP ステータスを使用し、返されるエラー JSON オブジェクトに重要なエラー情報を含めています。

当社は、問題のあるリクエストには、必ずエラー JSON オブジェクトを返すように努めています。 しかしながら、理論的には常に、内部サーバーの障害により、JSON 以外のエラーレスポンスが返される可能性があります。

属性

status応答の HTTP ステータスをここに再掲されるのでデバッグに役立ててください。
codeVectorizer.AI 内部エラーコード。
message人間が読みやすいエラーメッセージ、デバッグに役立ててください。

リクエストに対する HTTP ステータスが 200 の場合、JSON オブジェクトが返されず、リクエストは概して言えば正しく処理されたと想定することができます。

HTTP クライアントライブラリによっては、HTTP ステータスの例外を 400599 の範囲で上げてきます。 それら例外を捕捉して、適切に処理する必要があります。

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 によるファイルアップロードを行います。 コンテンツタイプ は、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

このモードは、このサービスと統合する場合に、開発者によって使用されることを意図したものです。 すべてのパラメータはサポートされていますが、目立つ透かしが入っています。

テスト結果は無料であり、有効なサブスクリプションは必要ありません。したがって、無料でサービスと統合することができます。

無料

整数、1003145828、デフォルト:2097252

最大入力画像サイズ(= ピクセル表示の幅 × 高さ) これより大きな画像は、処理前にこのサイズに圧縮されます。


整数、0256、デフォルト:0

結果に使用する最大色数。

0 とは、無制限を意味します。 1 および 2 は、両方とも白黒などの 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

2 次ベジェ曲線を許容するかどうか。 詳細


ブール型、デフォルト:true

3 次ベジェ曲線を許容するかどうか。 詳細


ブール型、デフォルト:true

円弧を許容するかどうか。 詳細


ブール型、デフォルト:true

楕円弧を許容するかどうか。 詳細


浮動小数型、0.0011.0、デフォルト:0.1

曲線とそれを近似する直線間のピクセル表示の最大距離。 詳細

隙間補完:


ブール型、デフォルト:true

ベクタービューワでよく発生する白線描画バグに対処するかどうか。 詳細


ブール型、デフォルト:false

隙間補完のストロークを切り取るかどうか。 output.shape_stacking=stacked の場合、切り取るか、非スケーリングストロークを使用するか。 詳細


ブール型、デフォルト:true

非スケーリング隙間補完ストロークを使用するかどうか。 output.shape_stacking=stacked の場合、切り取るか、非スケーリングストロークを使用するか。 詳細


浮動小数型、0.05.0、デフォルト:2.0

隙間補完ストロークの幅。 詳細

output.draw_style が、stroke_shapes または stroke_edges の場合のストロークスタイル


ブール型、デフォルト:true

非スケーリングストロークを使用するかどうか。 詳細


ブール型、デフォルト:false

上書き色または図形の推定色を使用するか。 詳細


形式:「#RRGGBB」、例:#FF00FF、デフォルト:#000000

上書き色。 詳細


浮動小数型、0.05.0、デフォルト:1.0

ストロークの幅。 詳細

出力サイズ:


浮動小数型、0.01000.0

均一スケーリング係数 指定されると、これが output.size.width および output.size.height に優先します。


浮動小数型、0.01.0E12

output.size.unit で指定された単位による幅。 幅および高さの一方かが指定されると、他方はアスペクト比が保持されるよう自動的に計算されます。


浮動小数型、0.01.0E12

output.size.unit で指定された単位による高さ。 幅および高さの一方かが指定されると、他方はアスペクト比が保持されるよう自動的に計算されます。


列挙型、デフォルト:none

幅および高さの測定単位。 この内、ptincm、および 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.01.0、デフォルト:0.5

output.size.aspect_ratio = preserve_inset または preserve_overflow の水平方向のアライメント

価値 水平方向のアライメント
0.0 左揃え
0.5 水平方向の中央揃え
1.0 右揃え
0.01.0 の間のどの値でも指定できます。


浮動小数型、0.01.0、デフォルト:0.5

output.size.aspect_ratio = preserve_inset または preserve_overflow の垂直方向のアライメント。

価値 縦のアライメント
0.0 上揃え
0.5 垂直方向の中央揃え
1.0 下揃え
0.01.0 の間のどの値でも指定できます。


浮動小数型、1.01000000.0

可能な場合、入力画像の DPI はファイルから読み込まれます。 このパラメータは、その値を上書きすることができます。 その結果の値は、入力画像の物理サイズを計算するのに使用されます。この物理サイズは、出力に物理単位が指定されており、幅または高さが明示的に指定されていない場合、出力サイズを計算するのに使用されます。


浮動小数型、1.01000000.0

出力画像の DPI。 これは、物理単位が指定されていない場合に、ビットマップ出力のピクセルサイズを計算するのに使用されます。

アカウントステータス 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 123:[secret]

応答の例

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

API 変更ログ

日付変更
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.scaleoutput.size.widthoutput.size.heightoutput.size.unitoutput.size.aspect_ratiooutput.size.align_xoutput.size.align_youtput.size.input_dpioutput.size.output_dpi。 ビットマップオプショングループとして次の 1 つのオプションが追加されました。output.bitmap.anti_aliasing_mode
2023/06/07 processing.max_colors を追加
2023/05/31 API パラメータを大幅に拡張。 API エンドポイントを更新。
2023/03/10 初回のリリース。
API キーを取得