Estimador de recorte cuadrado centrado en el rostro
Un rostro de 200 × 240 en la posición 400, 250 de una foto de 1200 × 900 da un cuadrado de 360 píxeles que empieza en x 320, y 190, con la cara centrada y un cuarto de margen en cada lado. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Ancho
- 1 200
- Altura
- 900
- Rostro X
- 400
- Rostro Y
- 250
- Ancho del rostro
- 200
- Alto del rostro
- 240
- X
- 320
- Y
- 190
- Lado
- 360
- Derecha
- 680
El estimador de recorte centrado en el rostro convierte el resultado de una detección facial en una región de recorte cuadrada lista para usar. Usted envía las dimensiones de la imagen y la caja delimitadora del rostro detectado —izquierda, parte superior, ancho y alto— más un margen opcional, y recibe las coordenadas exactas x, y y lado de un cuadrado que mantiene el rostro centrado y completamente dentro de la imagen. No se suben, decodifican ni transforman píxeles: es geometría pura y determinista, el paso de planificación que se ejecuta antes de un recorte real.
Por qué estimar el recorte antes de recortar
El recorte basado en rostros aparece en todas partes: fotos de perfil, generadores de avatares, miniaturas de un directorio de personas, vistas previas inteligentes en una biblioteca de fotos. En todos estos casos, la parte costosa es decodificar y recodificar la imagen, y la parte molesta es descubrir después que el encuadre era incorrecto: el rostro cortado por el borde, el cuadrado descentrado, el margen demasiado ajustado para una máscara circular. Esta capacidad separa la decisión barata de la ejecución costosa.
Usted ya ejecutó un detector de rostros y dispone de una caja delimitadora; en lugar de enviar la imagen directamente a una canalización y confiar en la suerte, pide primero la región exacta de recorte.
Cómo se calcula la región
El algoritmo es deliberadamente sencillo y totalmente determinista. Primero halla el centro de la caja delimitadora del rostro. El lado del cuadrado comienza como el mayor entre el ancho y el alto del rostro, escalado por uno más el doble del margen: así, el margen predeterminado de 0.25 añade una cuarta parte del tamaño del rostro a cada lado, dando un cuadrado de vez y media el lado mayor del rostro, un encuadre cómodo para retratos.
Si ese cuadrado es mayor que la propia imagen, se reduce a la dimensión más pequeña de esta. Después el cuadrado se centra en el centro del rostro y, cuando sobresaldría por un borde, se desplaza de nuevo hacia dentro de la imagen —se ajusta, nunca se deforma—, de modo que la región devuelta siempre es un recorte válido dentro de los límites.
Dónde encaja en una canalización
El flujo típico es: ejecute su detector de rostros preferido, tome la mejor caja delimitadora, llame a este estimador y pase la región devuelta a un recortador real, como la capacidad image.crop o su propio trabajador de miniaturas. Como el estimador nunca toca los bytes de la imagen, también puede usarlo solo con metadatos, por ejemplo para decidir, antes de descargar nada, si un rostro detectado cerca del borde producirá un cuadrado aprovechable o conviene recurrir a otro diseño.
El parámetro de margen es su único control: 0 da un cuadrado ajustado exactamente alrededor del lado mayor del rostro, 0.25 es el encuadre predeterminado para retratos, y 0.5 o más deja espacio para el cabello y los hombros.
Qué puede hacer con ella
Generar avatares cuadrados a partir de subidas
Tome la caja del rostro de su detector y obtenga el cuadrado exacto para alimentar su trabajador de recorte, con un margen que resiste una máscara circular.
Validar previamente una canalización de miniaturas
Valide las cajas de rostros y calcule las regiones de recorte solo a partir de metadatos, antes de pagar el costo de decodificar y recodificar una sola imagen.
Auditar recortes automatizados
Guarde la región estimada junto a cada recurso para que un avatar mal encuadrado pueda rastrearse hasta las coordenadas exactas que lo produjeron.
Preguntas frecuentes
¿Cuánto cuesta?
También es gratis ejecutarlo en su navegador en esta página, con exactamente el mismo resultado.
¿Tengo que subir la imagen?
No. Solo se envían las dimensiones de la imagen y la caja delimitadora del rostro: seis números. No se transmite, procesa ni almacena ningún dato de píxeles.
¿Qué ocurre si la caja del rostro sobresale de la imagen?
Una caja facial fuera de la imagen casi siempre es un error de detección o de correspondencia de coordenadas, y se notifica en lugar de recortarse en silencio.
¿Y si el cuadrado se extendiera más allá de un borde?
El cuadrado se desplaza de nuevo hacia dentro de la imagen manteniendo su tamaño y, si es mayor que la propia imagen, se reduce a su dimensión más pequeña. La región devuelta siempre queda completamente dentro de los límites.
¿Qué hace el margen?
Añade espacio alrededor del rostro como fracción de su lado mayor. El valor predeterminado 0.25 produce un cuadrado de 1.5 veces el lado mayor del rostro; 0 da un recorte ajustado y 0.5 deja un espacio generoso.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su 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)Ejemplo de solicitud
{
"width": 1200,
"height": 900,
"face_x": 400,
"face_y": 250,
"face_width": 200,
"face_height": 240
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.crop_face_center_estimate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 15 |
max_megapixels | 12 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Funciona gratis en su navegador en esta página, y mediante API a $0.002 por llamada.
Por qué estimar el recorte antes de recortar
La respuesta es un sencillo objeto JSON con x, y y lado que puede entregar a cualquier herramienta de recorte, desde ImageMagick hasta un elemento canvas, o guardar junto al recurso para que la decisión sea auditable. Como el cálculo es aritmética pura sobre seis números, casi no cuesta nada, responde en microsegundos y se comporta de forma idéntica en el navegador y en la API, de modo que puede prototipar de forma interactiva y automatizar después sin volver a comprobar ni un solo resultado.
Cómo se calcula la región
La propia caja del rostro se valida con rigor: orígenes negativos, tamaños no positivos y cajas que se extienden más allá de los bordes de la imagen generan un error invalid_input en lugar de producir en silencio un recorte defectuoso, porque una caja facial fuera de la imagen es un error del detector del que usted quiere enterarse.
Dónde encaja en una canalización
Todo se ejecuta en nuestra red global de borde sin almacenar nada, y el mismo módulo impulsa la calculadora gratuita de esta página, así que el número que ve en el navegador es, byte a byte, el número que la API devuelve cuando automatiza la llamada.
Preguntas técnicas
¿El resultado es determinista?
Sí. Es aritmética pura: mismos datos de entrada, mismas coordenadas, en el navegador y en la API, sin aleatoriedad, relojes ni red de por medio.