API Face Sticker

Pixian.AI offre un API face sticker unico. L'API crea ritagli di volti divertenti e allegri, utili per animali e persone.

Ottieni chiave API

Avvio rapido

POSTA un'immagine bitmap e ottieni un risultato con face sticker:

$ curl https://api.pixian.ai/api/v2/face-sticker \
 -u xyz123:[secret] \
 -F image=@example.jpeg \
 -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker")
   .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
   .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("pixian_result.png")) {
      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://api.pixian.ai/api/v2/face-sticker", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("pixian_result.png", 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://api.pixian.ai/api/v2/face-sticker',
  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("pixian_result.png", body);
  }
});
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
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("pixian_result.png", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://api.pixian.ai/api/v2/face-sticker',
    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('pixian_result.png', '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 cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}

response = client.post("https://api.pixian.ai/api/v2/face-sticker", {
  "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("pixian_result.png", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end
$ curl https://api.pixian.ai/api/v2/face-sticker \
 -u xyz123:[secret] \
 -F 'image.url=https://example.com/example.jpeg' \
 -o pixian_result.png
// Requires: org.apache.httpcomponents.client5:httpclient5-fluent

Request request = Request.post("https://api.pixian.ai/api/v2/face-sticker")
   .addHeader("Authorization", "Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd")
   .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("pixian_result.png")) {
      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://api.pixian.ai/api/v2/face-sticker", form).Result;

   if (response.IsSuccessStatusCode)
   {
      // Write result to disk, TODO: or wherever you'd like
      FileStream outStream = new FileStream("pixian_result.png", 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://api.pixian.ai/api/v2/face-sticker',
  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("pixian_result.png", body);
  }
});
$ch = curl_init('https://api.pixian.ai/api/v2/face-sticker');

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array('Authorization: Basic cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd'));
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("pixian_result.png", $data);
} else {
  echo "Error: " . $data;
}
curl_close($ch);
# Requires "requests" to be installed (see https://pypi.org/project/requests/)
import requests

response = requests.post(
    'https://api.pixian.ai/api/v2/face-sticker',
    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('pixian_result.png', '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 cHh4YmJ6Yjk2bjJ3OGFtOltzZWNyZXRd"
}

response = client.post("https://api.pixian.ai/api/v2/face-sticker", {
  "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("pixian_result.png", 'w') { |file| file.write(response.body) }
else
  puts "Error: Code: " + response.status.to_s + ", Reason: " + response.reason
end

Livelli di prezzi

L'integrazione e la prova dell'API è gratuita, non occorre un acquisto.

Usa semplicemente test=true per lo sviluppo. Pupi valutare la qualità del risultato usando la Web App interattiva alla prima pagina.

I risultati della produzione richiedono l'acquisto di un pacchetto crediti. Vedi la pagina dei prezzi.

Autenticazione e Sicurezza

L'API utilizza l'autenticazione di base HTTP standard. Tutte le richieste all'API devono essere effettuate sull'HTTPS e includere le tue credenziali API, con l'ID API come utente e il segreto API come password.

La tua libreria client HTTP deve supportare l'Indicazione nome server (SNI) per fare richieste con successo. Se ricevi strani errori di handshake, probabilmente dipende da questo.

Limitazione di velocità

L'uso dell'API è a velocità limitata con concessioni generose e nessun limite superiore fisso.

Durante l'operazione normale gestita dall'utente finale non dovresti trovare limiti di velocità in quanto l'uso tende a fluire e rifluire in un modo che il servizio gestisce agilmente.

Tuttavia, per lavori in batch raccomandiamo di iniziare con almeno 5 thread, aggiungendo 1 nuovo thread ogni 5 minuti fino a raggiungere il livello di parallelismo desiderato. Ti pregheremmo di contattarci prima di iniziare se hai bisogno di oltre 100 thread simultanei.

Se inoltri troppe richieste inizierai a ricevere risposte 429 Too Many Requests. In tal caso dovresti applicare un backoff lineare: alla prima risposta di questo tipo, attendi 5 secondi prima di inoltrare la richiesta successiva. Alla seconda risposta 429 consecutiva, attendi 2*5=10 secondi prima di inoltrare la richiesta successiva. Alla terza attendi 3*5=15 secondi, ecc.

Puoi reimpostare il contatore di backoff dopo una richiesta riuscita, e dovresti applicare il backoff per thread (vale a dire i thread dovrebbero essere indipendenti l'uno dall'altro).

Timeout

Sebbene le richieste API siano normalmente completate in pochi secondi, è possibile che durante picchi di carico occorra più tempo per l'elaborazione.

Per assicurarti che la tua libreria clienti non termini troppo presto le richieste API dovrebbero essere configurate con un timeout inattività di almeno 180 secondi.

Errore Oggetto JSON

Usiamo stati HTTP convenzionali per indicare se una richiesta API riesce o meno, includendo importanti informazioni di errore nell'Errore Oggetto JSON restituito.

Cerchiamo di restituire sempre un Errore Oggetto JSON con qualsiasi richiesta problematica. Tuttavia, in teoria è sempre possibile che vi siano errori interni del server che portano a una risposta non di errore JSON.

Attributi

statusLo status HTTP della risposta, ripetuto qui come ausilio per il debug.
codeCodice errore interno Pixian.AI.
messageMessaggio di errore leggibile, previsto per aiutare con il debug.

Se lo status HTTP per la tua richiesta è 200 non sarà restituito un Errore Oggetto JSON, e puoi presumere con sicurezza che la richiesta in senso lato è riuscita.

Alcune librerie client HTTP generano eccezioni per gli stati HTTP nel range 400-599. Dovrai catturare queste eccezioni e gestirle idoneamente.

HTTP StatusSignificato
200-299

Operazione riuscita

400-499

Esiste un problema con le informazioni fornite nella richiesta (per esempio un parametro mancante). Controlla il messaggio di errore per determinare come risolverlo.

500-599

Si è verificato un errore Pixian.AI interno. Attendi un momento quindi riprova, e se il problema persiste inviaci una email.

Esempio di risposta di errore

{
  "error" : {
    "status" : 400,
    "code" : 1006,
    "message" : "Failed to read the supplied image. "
  }
}

Face Sticker POST
https://api.pixian.ai/api/v2/face-sticker

Per ottenere un face sticker da un'immagine, devi eseguire un caricamento file POST HTTP standard. Tieni presente che il Contenuto-Tipo deve essere multipart/form-data quando carichi file binari.

Parametri

L'immagine inserita deve essere fornita come:


Binario

Un file binario.


Stringa

Stringa codificata base64. La stringa può essere di 1 megabyte massimo.


Stringa

Un URL da recuperare ed elaborare.

Deve essere un file .bmp, .gif, .jpeg, .png, o .tiff.

Le dimensioni massime per il caricamento dell'immagine (= larghezza × altezza) sono 32.000.000 pixel, che sono ridotte a max_pixels.


Booleano, default: false

Passa in true per indicare che questa è un'immagine di prova.

Ometti o passa a false per le immagini di produzione.

Le immagini di prova possono essere elaborate gratuitamente, ma il risultato avrà una filigrana incorporata.


Intero, 100 a 25000000, default: 25000000

Le dimensioni massime di input dell'immagine (= larghezza × altezza). Immagini più grandi saranno ridotte a queste dimensioni prima dell'elaborazione.


Formato: '#RRGGBB', es. #0055FF

Colore di sfondo da applicare al risultato. Ometti per lasciare uno sfondo trasparente.

Non dimenticarti di includere il prefisso '#'.


Booleano, default: true

Se ritagliare il risultato all'oggetto in primo piano.

Molto utile insieme a result.margin e result.target_size per ottenere un risultato di dimensioni corrette e ben centrato ogni volta.


Formato: '(x.y%|px){1,4}', e.g. 10px 20% 5px 15%, default: 1px

Margine da aggiungere al risultato.

Viene aggiunto indipendentemente dal fatto che il risultato sia ritagliato o meno al primo piano.

Se result.target_size è specificato, il margine viene inserito, vale a dire, le dimensioni effettive target non sono ampliate.

Le unità supportate sono % e px. Segue la semantica CSS, per questo motivo puoi usare una qualsiasi delle opzioni seguenti:

  • [all]
  • [top/bottom] [left/right]
  • [top] [left/right] [bottom]
  • [top] [right] [bottom] [left]


Formato: 'w h', es. 1920 1080

Applica dimensioni di risultato specifiche in pixel. Il risultato sarà ridimensionato per adattarsi alle dimensioni specificate. Se è presente spazio in eccesso, è sempre centrato orizzontalmente, con result.vertical_alignment che controlla il trattamento verticale.


Num, default: middle

Specifica come distribuire lo spazio verticale in eccesso quando viene usato result.target_size.


Num, default: auto

Formato output. auto viene interpretato come png per i risultati trasparenti, e jpeg per i risultati opachi, vale a dire quando un background.color è stato specificato.

delta_png è un formato avanzato, veloce e di dimensioni ridotte, particolarmente utile quando esistono limiti di latenza e larghezza banda basse, come le app mobili. Codifica lo sfondo come nero trasparente 0x00000000 e il primo piano come bianco trasparente 0x00FFFFFF. I pixel parzialmente trasparenti hanno i propri valori effettivi di colore. Puoi usarlo insieme all'immagine di input per ricostruire il risultato completo. Learn more about the Delta PNG format

background.color, result.crop_to_foreground, result.margin, result.target_size, e result.vertical_alignment sono ignorati quando si usa delta_png. Il risultato deve essere delle stesse dimensioni dell'immagine di input, altrimenti la decodifica non riesce, per questo motivo max_pixels non deve aver causato la riduzione dell'input.


Intero, 1 a 100, default: 75

La qualità da usare per la codifica dei risultati JPEG.

Intestazioni risultato

X-Credits-Charged Crediti effettivi addebitati.
X-Credits-Calculated I crediti calcolati che sarebbero stati addebitati in caso di una richiesta di produzione. Restituiti soltanto per richieste di test.
X-Input-Orientation Il tag di orientamento EXIF da cui leggiamo e applicato all'immagine di input. È un valore integer da 1 a 8 incluso. È utile se la libreria di caricamento dell'immagine non support l'orientamento EXIF. Read more about EXIF orientation here
X-Input-Size [width] [height] dell'immagine input in pixel prima dell'applicazione di qualsiasi limitazione di dimensioni.
X-Result-Size [width] [height] dell'immagine di risultato in pixel.
X-Input-Foreground [top] [left] [width] [height] riquadro di delimitazione del primo piano nelle coordinate dell'immagine input.
X-Result-Foreground [top] [left] [width] [height] riquadro di delimitazione del primo piano nelle coordinate dell'immagine risultato.

Changelog API Face Sticker

DataModifica
11 apr 2024 Release iniziale.
Ottieni chiave API