Vectorizer.AI มี API การแปลงบิตแมปเต็มรูปแบบ API จะแปลงพิกเซลเป็นเวกเตอร์อย่างครบถ้วนโดยอัตโนมัติ และมีความเที่ยงตรงเหนือชั้นกว่าเครื่องมืออื่นในระดับเดียวกัน
โพสต์ภาพบิตแมปและรอรับผลลัพธ์ที่เป็นภาพเวกเตอร์กลับมา
$ curl https://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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://th.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 ที่มีขนาดใหญ่กว่าภาพอินพุตถึง 4 เท่า และมีลายน้ำกำกับให้เห็น ในราคาภาพละ 0.20 0.20 เครดิต
เพียงแค่ใช้ mode=preview
เพื่อรับภาพตัวอย่าง
โปรดดูหน้าการกำหนดราคาสำหรับแผนบริการสมาชิก
API ใช้ การรับรองความถูกต้องเบื้องต้นของการเข้าถึง HTTP แบบมาตรฐาน คำร้องขอทั้งหมดถึง API ต้องดำเนินการผ่าน HTTPS และมีข้อมูลประจำตัว API ของคุณ โดยมี API Id เป็นผู้ใช้ และรหัสลับ API เป็นรหัสผ่าน
ไลบรารีไคลเอ็นต์ http ของคุณต้องรองรับ การบ่งชี้ชื่อเซิร์ฟเวอร์ (SNI) จึงจะส่งคำขอได้สำเร็จ หากคุณได้รับข้อผิดพลาดการสื่อสารที่ผิดปกติ ก็น่าจะเป็นเพราะเหตุนี้มากที่สุด
การใช้งาน API มีอัตราที่จำกัด โดยเผื่อค่าไว้กว้างและไม่มีขอบเขตบนที่เคร่งครัด
ในระหว่างการดำเนินการที่ผู้ใช้ปลายทางกระทำตามปกตินั้น มีโอกาสน้อยที่คุณจะประสบกับอัตราที่จำกัด เพราะการใช้งานมีแนวโน้มที่จะขึ้น ๆ ลง ๆ ในลักษณะที่บริการจัดการได้อย่างเรียบร้อย
อย่างไรก็ตาม ในกรณีของชุดงาน เราขอแนะนำให้เริ่มต้นด้วยชุดกิจกรรมสูงสุด 5 ชุด โดยเพิ่มใหม่ 1 ชุดทุก ๆ 5 นาที จนกว่าคุณจะไปถึงระดับการทำงานแบบขนานตามที่ต้องการ กรุณาแจ้งให้เราทราบก่อนที่คุณจะเริ่มงาน หากต้องการชุดกิจกรรมมากกว่า 100 ชุดพร้อมกัน
หากคุณส่งคำขอมากเกินไป คุณจะเริ่มได้รับผลตอบกลับ 429 Too Many Requests
เมื่อเกิดกรณีเช่นนี้ขึ้น คุณควรปรับใช้กลยุทธ์สุ่มรอเวลาแบบเส้นตรง : ในผลตอบกลับดังกล่าวครั้งแรก รอ 5 วินาที ก่อนส่งคำขอถัดไป ในผลตอบกลับ 429 ที่ต่อเนื่องกันครั้งที่สอง รอ 2*5=10 วินาที ก่อนส่งคำขอถัดไป ส่วนครั้งที่สาม จะรอ 3*5=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 ส่งกลับ
POST
https://api.vectorizer.ai/api/v1/vectorize
ในการปรับภาพให้เป็นเวกเตอร์ คุณจะทำการอัปโหลดไฟล์ HTTP POST แบบมาตรฐาน อย่าลืมว่า ประเภท-เนื้อหา ต้องเป็น multipart/form-data
เมื่ออัปโหลดไฟล์ไบนารี
ตารางด้านล่างแสดงพารามิเตอร์ทั้งหมดของ API ในแบบฟอร์ม "ลองใช้ตอนนี้" ที่ใช้งานได้ พารามิเตอร์แต่ละตัวมีคำอธิบายสั้น ๆ แต่อย่าลืมอ่านเอกสารที่มีรายละเอียดเกี่ยวกับตัวเลือกเอาต์พุต
GET
https://api.vectorizer.ai/api/v1/account
ดึงข้อมูลพื้นฐานเกี่ยวกับบัญชีของคุณ เช่น สถานะการสมัครสมาชิกและจำนวนเครดิตที่เหลืออยู่
พารามิเตอร์ |
|
---|---|
ไม่มี |
ลักษณะเฉพาะผลตอบกลับ |
|
---|---|
subscriptionPlan |
แผนสมาชิกที่คุณมีอยู่ในขณะนี้ หรือ 'ไม่มี' |
subscriptionState |
สถานะการเป็นสมาชิกของคุณในขณะนี้ ('ใช้บริการ' หรือ 'ค้างชำระ') หรือ 'สิ้นสุดแล้ว' หากไม่ได้เป็นสมาชิก |
credits |
จำนวนเครดิต API ที่คงเหลือในบัญชีของคุณ ค่าเท่ากับ 0 ถ้าไม่ได้เป็นสมาชิกในขณะนี้ หรือเป็นสมาชิกแผนบริการที่ไม่ใช่ API ตัวเลขอาจเป็นเศษส่วนก็ได้ ดังนั้นอย่าลืมแยกวิเคราะห์เป็นเลขทศนิยม |
ชื่อผู้ใช้ = API Id, รหัสผ่าน = รหัสลับ API
cURL
$ curl "https://api.vectorizer.ai/api/v1/account" \ -u 123:[secret]
ตัวอย่างผลตอบกลับ
{ "subscriptionPlan" : "none", "subscriptionState" : "ended", "credits" : 0 }
วันที่ | เปลี่ยน |
---|---|
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 ให้มากขึ้นอีกมาก อัปเดตให้ URL ที่เป็นจุดหมายของ API |
10 มี.ค. 2023 | ออกเผยแพร่ครั้งแรก |