Image Vectorization 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);
# Requires "requests" to be installed (see python-requests.org)
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
    },
    headers={
        'Authorization':
        'Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'
    },
)
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);
# Requires "requests" to be installed (see python-requests.org)
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
    },
    headers={
        'Authorization':
        'Basic dmt5YzY3a3FhMjd5aWRkOltzZWNyZXRd'
    },
)
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 との統合とテストは無料で、サブスクリプションは不要です。

Production results require a subscription and are 1.00 credits each.

また、購入前にエンドユーザーに表示できるプレビュー結果も提供しています。 プレビューは、入力データの 4 倍大きい PNG 画像で、目立たないウォーターマークが付いています。 Previews are 0.20 credits each.

サブスクリプションプランの料金ページをご覧ください

認証およびセキュリティ

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 秒待ちます(以下同様)。

バックオフカウンターは、リクエストが正しく完了した後リセットできます。バックオフはスレッドごとに適用してください(すなわち、スレッドは相互に独立に操作する)。

ベクター化 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

このモードは、エンドユーザーが購入する前にプレビューを表示したい場合を対象としています。

矛盾するパラメータは無視して、目立たないウォーターマークの付いた 4x PNG 結果を生成します。

0.20
test

このモードは、開発者がサービスと統合する際に使用することを目的としています。 すべてのパラメータがサポートされていますが、かなりの透かしが入っています。

テスト結果は無料で、アクティブなサブスクリプションを必要としないため、サービスと無料で統合できます。

無料

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

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


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

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

0 とは、無制限を意味します。 1 および 2 は、両方とも白黒などの 2 色を意味します。 N>=2 は、その数の色を示します。


列挙型、デフォルト: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。 これは、物理単位が指定されていない場合に、ビットマップ出力のピクセルサイズを計算するのに使用されます。

API 変更ログ

日付変更
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 キーを取得