API de stickers visage

Pixian.AI propose une API de stickers visage. L'API crée des découpes de visages amusantes et festives, utiles aussi bien pour les animaux que pour les humains.

Obtenir la clé API

Démarrage rapide

POSTEZ une image bitmap et obtenez un sticker visage :

$ 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

Tarifs

L'intégration et le test de l'API sont gratuits, aucun achat requis.

Utilisez simplement test=true pour le développement. Vous pouvez évaluer la qualité des résultats à l’aide de l’application Web interactive sur la première page.

Les résultats en production nécessitent l’achat d’un pack de crédits. Veuillez consulter la page des prix.

Authentification et sécurité

L'API utilise une authentification d'accès de base HTTP standard. Toutes les requêtes vers l'API doivent être effectuées via HTTPS et inclure vos identifiants API, l'identifiant API étant l'utilisateur et le secret API étant le mot de passe.

Votre bibliothèque des clients http doit prendre en charge le SNI (Server Name Indication) pour que les requêtes puissent être adressées. Si vous recevez d'étranges erreurs de protocole d'accord (handshake), c'est très probablement le cas.

Taux limité

Le taux d'utilisation de l'API est limité avec des allocations généreuses et aucune limite supérieure stricte.

Au cours d'un fonctionnement normal axé sur l'utilisateur final, il est peu probable que vous rencontriez une limitation de débit, car l'utilisation a alors tendance à refluer et à s'écouler d'une manière que le service gère avec fluidité.

Cependant, pour les travaux par lots, nous vous recommandons de commencer avec au plus 5 fils, en ajoutant 1 nouveau fil toutes les 5 minutes jusqu'à ce que vous ayez atteint le niveau de parallélisme souhaité. Veuillez nous contacter avant de commencer si vous avez besoin de plus de 100 fils simultanés.

Si vous soumettez trop de requêtes, vous commencerez à recevoir des réponses 429 Too Many Requests. Dans ce cas, vous devrez appliquer un retrait linéaire : lorsque vous recevez la première réponse de ce type, attendez 5 secondes avant de soumettre la requête suivante. Lorsque vous recevez la deuxième réponse 429 consécutive, attendez 2*5=10 secondes avant de soumettre la requête suivante. À la troisième réponse, attendez 3*5=15 secondes, et ainsi de suite.

Vous pouvez réinitialiser le compteur de recul après une requête réussie et vous devez appliquer le recul fil par fil (c'est-à-dire que les fils doivent fonctionner indépendamment les uns des autres).

Délais d'attente

Bien que les requêtes API soient normalement exécutées en quelques secondes, des temps de traitement plus longs peuvent survenir lors de pics de charge transitoires.

Pour garantir que votre bibliothèque cliente ne met pas fin prématurément aux requêtes API, elle doit être configurée avec un délai d'inactivité d'au moins 180 secondes.

Objet JSON d'erreur

Nous utilisons des statuts HTTP classiques pour indiquer le succès ou l'échec d'une requête API, et incluons d'importantes informations sur l'Objet JSON d'erreur retourné.

Nous nous efforçons de toujours renvoyer un Objet JSON d'erreur en cas de requête problématique. Des erreurs de serveur internes pouvant causer des messages d'erreur non JSON sont toutefois théoriquement possibles.

Attributs

statusLe statut HTTP de la réponse, répété ici pour faciliter l'élimination des erreurs.
codeCode d'erreur interne Pixian.AI.
messageMessage d'erreur interprétable par l'utilisateur, destiné à faciliter l'élimination des erreurs.

Si le statut HTTP de votre requête est 200, aucun Objet JSON d'erreur ne sera retourné, et vous pouvez présumer que la requête dans son ensemble a réussi.

Certaines bibliothèques de clients HTTP déclenchent des exceptions pour les états HTTP dans la plage 400599. Vous devez repérer ces exceptions et les traiter adéquatement.

HTTP StatusSignification
200-299

Succès

400-499

Un problème est survenu avec les informations fournies dans la requête (un paramètre peut être manquant, par exemple). Veuillez revoir le message d'erreur pour déterminer la manière de le résoudre.

500-599

Une erreur interne Pixian.AI s'est produite. Patientez un instant puis réessayez. Veuillez nous envoyer un e-mail si le problème persiste.

Exemple de message d'erreur

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

Stickers visage POST
https://api.pixian.ai/api/v2/face-sticker

Pour obtenir un sticker visage à partir d’une image, vous effectuez un téléchargement de fichier HTTP POST standard. N'oubliez pas que le type de contenu doit être multipart/form-data pour le téléchargement en amont de fichiers binaires.

Paramètres

L'image source doit être fournie de l'une des manières suivantes :


Binaire

Fichier binaire.


Chaîne

Chaîne encodée base64. La taille de la chaîne doit être de 1mégaoctet maximum.


Chaîne

Une URL pour l'extraction et le traitement.

Doit être un fichier .bmp, .gif, .jpeg, .png ou .tiff.

La taille maximale de téléchargement d'image (= largeur × hauteur) est de 32 000 000 pixels, qui est réduite à max_pixels.


Booléen, défaut : false

Indiquez true pour indiquer qu'il s'agit d'une image d'essai.

Omettez ou passez false pour les images de production.

Les images-tests sont traitées gratuitement mais comporteront un tatouage numérique.


Entier, 100 à 25000000, défaut : 25000000

La taille maximale de l'image d'entrée (= largeur × hauteur). Les images plus grandes seront réduites à cette taille avant le traitement.


Format : '#RRGGBB', par ex. #0055FF

Couleur d'arrière-plan à appliquer au résultat. Omettez pour laisser un arrière-plan transparent.

Veillez à inclure le préfixe « # ».


Booléen, défaut : true

Pour recadrer ou non le résultat sur l'objet de premier plan.

Très utile avec result.margin et result.target_size pour obtenir un résultat bien dimensionné et centré à chaque fois.


Format : '(x.y%|px){1,4}', par ex. 10px 20% 5px 15%, défaut : 1px

Marge à ajouter au résultat.

Elle est ajoutée, que le résultat soit recadré sur premier plan ou non.

Si result.target_size est spécifié, la marge est insérée, c'est-à-dire qu'elle n'augmente pas la taille cible effective.

Les unités prises en charge sont % et px. La sémantique CSS est appliquée, et vous pouvez donc utiliser n'importe lequel des éléments suivants :

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


Format : 'w h', par ex. 1920 1080

Appliquez une taille de résultat spécifique en pixels. Le résultat sera mis à l'échelle pour s'adapter à la taille spécifiée. S'il y a de l'espace en excès, le résultat est toujours centré horizontalement, avec result.vertical_alignment contrôlant le traitement vertical.


Énum, défaut : middle

Spécifie comment allouer l'espace vertical excédentaire lorsque result.target_size est utilisé.


Énum, défaut : auto

Format de sortie. auto est interprété comme png pour les résultats transparents, et jpeg pour les résultats opaques, c'est-à-dire lorsqu'une background.color a été spécifiée.

delta_png est un format avancé, rapide et très compact, particulièrement utile pour les situations à faible latence et à bande passante limitée, comme les applications mobiles. Il code l'arrière-plan en noir transparent 0x00000000 et le premier plan en blanc transparent 0x00FFFFFF. Les pixels partiellement transparents ont leurs valeurs de couleur réelles. Avec l'image d'entrée, vous pouvez l'utiliser pour reconstruire le résultat complet. Learn more about the Delta PNG format

background.color, result.crop_to_foreground, result.margin, result.target_size et result.vertical_alignment sont ignorés lorsque delta_png est utilisé. Le résultat doit avoir la même taille que l'image d'entrée, sinon votre décodage échouera, donc max_pixels ne doit pas avoir entraîné la réduction de l'entrée.


Entier, 1 à 100, défaut : 75

La qualité à utiliser lors de l’encodage des résultats JPEG.

En-têtes de résultats

X-Credits-Charged Les crédits réellement facturés.
X-Credits-Calculated Les crédits calculés qui auraient été facturés s'il s'agissait d'une demande de production. Uniquement renvoyés pour les demandes de test.
X-Input-Orientation La balise d'orientation EXIF que nous lisons et appliquons à l'image d'entrée. Il s'agit d'une valeur entière comprise entre 1 et 8 inclus. Ceci est utile si votre bibliothèque de chargement d'images ne prend pas en charge l'orientation EXIF. Read more about EXIF orientation here
X-Input-Size [width] [height] de l'image d'entrée en pixels, avant l'application de toute contrainte de taille.
X-Result-Size [width] [height] du résultat, en pixels.
X-Input-Foreground [top] [left] [width] [height] du cadre de délimitation du premier plan dans les coordonnées de l'image d'entrée.
X-Result-Foreground [top] [left] [width] [height] du cadre de délimitation du premier plan dans les coordonnées du résultat.

Journal des modifications de l'API de stickers visage

DateModifier
11 avr. 2024 Première version.
Obtenir la clé API