Estimation de zone de recadrage carré centrée sur le visage
Un visage de 200 × 240 placé en 400, 250 sur une photo de 1200 × 900 donne un carré de 360 pixels qui commence en x 320, y 190, visage centré et un quart de marge de chaque côté. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- Largeur
- 1 200
- Hauteur
- 900
- Visage X
- 400
- Visage Y
- 250
- Largeur du visage
- 200
- Hauteur du visage
- 240
- X
- 320
- Y
- 190
- Côté
- 360
- Droite
- 680
L'estimateur de recadrage centré sur le visage transforme un résultat de détection en zone carrée prête à l'emploi. Vous envoyez les dimensions de l'image et le cadre du visage détecté — gauche, haut, largeur et hauteur — plus une marge facultative, et vous obtenez en retour les valeurs exactes x, y et le côté d'un carré qui garde le visage centré et entièrement dans l'image. Aucun pixel n'est téléversé, décodé ni transformé : il s'agit de géométrie pure et déterministe, l'étape de planification à exécuter avant un recadrage réel.
Pourquoi estimer le recadrage avant de recadrer
Le recadrage axé sur le visage est partout : photos de profil, générateurs d'avatars, vignettes d'un annuaire de personnes, aperçus intelligents d'une photothèque. Dans tous ces cas, la partie coûteuse est le décodage et le réencodage de l'image, et la partie agaçante est de découvrir après coup que le cadrage était mauvais — visage coupé au bord, carré décentré, marge trop juste pour un masque circulaire. Cette fonctionnalité sépare la décision peu coûteuse de l'exécution coûteuse.
Vous avez déjà exécuté un détecteur de visages et vous disposez d'un cadre ; au lieu d'envoyer l'image directement dans une chaîne de traitement en espérant le meilleur, vous demandez d'abord la zone de recadrage exacte.
Comment la zone est calculée
L'algorithme est volontairement simple et entièrement déterministe. Il commence par trouver le centre du cadre du visage. Le côté du carré part de la plus grande des dimensions du visage, multipliée par un plus deux fois la marge : la marge par défaut de 0.25 ajoute ainsi un quart de la taille du visage de chaque côté, ce qui donne un carré d'une fois et demie le plus grand côté du visage, un cadrage confortable pour les portraits.
Si ce carré dépasse la taille de l'image elle-même, il est réduit à sa plus petite dimension. Le carré est ensuite centré sur le centre du visage et, lorsqu'il déborderait d'un bord, il est ramené à l'intérieur de l'image — ajusté, jamais déformé — de sorte que la zone renvoyée soit toujours un recadrage valide dans les limites.
Sa place dans une chaîne de traitement
Le flux typique est le suivant : exécutez le détecteur de visages de votre choix, retenez le meilleur cadre, appelez cet estimateur, puis transmettez la zone renvoyée à un véritable outil de recadrage tel que la fonctionnalité image.crop ou votre propre processus de vignettes.
Comme l'estimateur ne touche jamais aux octets de l'image, vous pouvez aussi l'utiliser sur les seules métadonnées — par exemple pour décider, avant de télécharger quoi que ce soit, si un visage détecté près d'un bord produira un carré exploitable ou s'il faut prévoir une autre mise en page.
Le paramètre de marge est votre seul réglage : 0 donne un carré ajusté exactement autour du plus grand côté du visage, 0.25 est le cadrage portrait par défaut, et 0.5 ou plus laisse de la place pour les cheveux et les épaules.
Cas d’usage
Générer des avatars carrés à partir d'envois
Prenez le cadre du visage fourni par votre détecteur et obtenez le carré exact à transmettre à votre processus de recadrage, avec une marge qui résiste à un masque circulaire.
Prévalider une chaîne de vignettes
Validez les cadres de visages et calculez les zones de recadrage à partir des seules métadonnées, avant de payer le coût du décodage et du réencodage d'une seule image.
Auditer des recadrages automatisés
Stockez la zone estimée à côté de chaque ressource pour qu'un avatar mal cadré puisse être retracé jusqu'aux coordonnées exactes qui l'ont produit.
Questions fréquentes
Combien cela coûte-t-il ?
L'outil est également gratuit dans votre navigateur sur cette page, avec exactement le même résultat.
Dois-je téléverser l'image ?
Non. Seules les dimensions de l'image et le cadre du visage sont envoyés — six nombres. Aucune donnée de pixels n'est transmise, traitée ni stockée.
Que se passe-t-il si le cadre du visage dépasse de l'image ?
Un cadre de visage hors de l'image est presque toujours un bug de détection ou de correspondance de coordonnées, et il est signalé au lieu d'être silencieusement recadré.
Et si le carré dépassait d'un bord ?
Le carré est ramené à l'intérieur de l'image en conservant sa taille, et s'il est plus grand que l'image elle-même, il est réduit à sa plus petite dimension. La zone renvoyée est toujours entièrement dans les limites.
À quoi sert la marge ?
Elle ajoute de l'espace autour du visage, exprimé en fraction du plus grand côté du visage. La valeur par défaut 0.25 donne un carré de 1.5 fois le plus grand côté du visage ; 0 donne un recadrage ajusté et 0.5 laisse un espace généreux.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/image/crop-face-center-estimate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"width":1200,"height":900,"face_x":400,"face_y":250,"face_width":200,"face_height":240}'const res = await fetch("https://api.kit.forhosting.com/image/crop-face-center-estimate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"width": 1200,
"height": 900,
"face_x": 400,
"face_y": 250,
"face_width": 200,
"face_height": 240
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/crop-face-center-estimate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"width": 1200,
"height": 900,
"face_x": 400,
"face_y": 250,
"face_width": 200,
"face_height": 240
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/crop-face-center-estimate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"width":1200,"height":900,"face_x":400,"face_y":250,"face_width":200,"face_height":240}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"width":1200,"height":900,"face_x":400,"face_y":250,"face_width":200,"face_height":240}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/crop-face-center-estimate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"width": 1200,
"height": 900,
"face_x": 400,
"face_y": 250,
"face_width": 200,
"face_height": 240
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.crop_face_center_estimate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 15 |
max_megapixels | 12 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
L'outil fonctionne gratuitement dans votre navigateur sur cette page, et via API à $0.002 par appel.
Pourquoi estimer le recadrage avant de recadrer
La réponse est un simple objet JSON avec x, y et le côté, que vous pouvez confier à n'importe quel outil de recadrage, d'ImageMagick à un élément canvas, ou stocker à côté de la ressource pour que la décision reste vérifiable. Comme le calcul n'est que de l'arithmétique pure sur six nombres, il ne coûte presque rien, répond en quelques microsecondes et se comporte à l'identique dans le navigateur et sur l'API : vous pouvez donc prototyper interactivement puis automatiser sans revérifier un seul résultat.
Comment la zone est calculée
Le cadre du visage lui-même est validé strictement : origines négatives, dimensions nulles ou négatives et cadres dépassant les bords de l'image déclenchent une erreur invalid_input au lieu de produire silencieusement un recadrage défectueux, car un cadre de visage hors de l'image est un bug du détecteur qu'il vaut mieux connaître.
Sa place dans une chaîne de traitement
Tout s'exécute sur notre réseau de périphérie mondial sans rien stocker, et le même module alimente le calculateur gratuit de cette page : le nombre affiché dans le navigateur est donc, à l'octet près, celui que l'API renvoie lorsque vous automatisez l'appel.
Questions techniques
Le résultat est-il déterministe ?
Oui. C'est de l'arithmétique pure : mêmes entrées, mêmes coordonnées, dans le navigateur comme sur l'API, sans aléa, horloge ni réseau.