Corte quadrado centralizado no rosto: calcule a região exata
Um rosto de 200 × 240 na posição 400, 250 de uma foto de 1200 × 900 gera um quadrado de 360 pixels que começa em x 320, y 190, com o rosto centralizado e um quarto de margem em cada lado. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Largura
- 1.200
- Altura
- 900
- Rosto X
- 400
- Rosto Y
- 250
- Largura do rosto
- 200
- Altura do rosto
- 240
- X
- 320
- Y
- 190
- Lado
- 360
- Direita
- 680
O estimador de corte centralizado no rosto transforma o resultado de uma detecção facial em uma região de corte quadrado pronta para uso. Você envia as dimensões da imagem e a caixa delimitadora do rosto detectado — esquerda, topo, largura e altura — além de uma margem opcional, e recebe de volta os valores exatos de x, y e lado de um quadrado que mantém o rosto centralizado e totalmente dentro da imagem. Nenhum pixel é enviado, decodificado ou transformado: trata-se de geometria pura e determinística, a etapa de planejamento que você executa antes do corte real.
Por que estimar o corte antes de cortar
O corte sensível a rostos aparece em todo lugar: fotos de perfil, geradores de avatar, miniaturas de um diretório de pessoas, pré-visualizações inteligentes em uma biblioteca de fotos. Em todos eles, a parte custosa é decodificar e recodificar a imagem, e a parte irritante é descobrir depois que o enquadramento saiu errado — o rosto cortado na borda, o quadrado fora do centro, a margem apertada demais para uma máscara circular. Esta capacidade separa a decisão barata da execução cara.
Você já executou um detector de rostos e tem uma caixa delimitadora; em vez de alimentar a imagem diretamente em um pipeline e torcer pelo melhor, você solicita primeiro a região exata de corte.
Como a região é calculada
O algoritmo é deliberadamente simples e totalmente determinístico. Primeiro, ele encontra o centro da caixa delimitadora do rosto. O lado do quadrado começa como o maior valor entre a largura e a altura do rosto, multiplicado por um mais duas vezes a margem — assim, a margem padrão de 0.25 adiciona um quarto do tamanho do rosto em cada lado, gerando um quadrado uma vez e meia maior que o maior lado do rosto, um enquadramento confortável para retratos.
Se esse quadrado for maior que a própria imagem, ele é reduzido à menor dimensão dela. O quadrado é então centralizado no centro do rosto e, quando ultrapassaria alguma borda, deslocado de volta para dentro da imagem — limitado, nunca deformado — de modo que a região retornada é sempre um corte válido e dentro dos limites.
Onde ele se encaixa em um pipeline
O fluxo típico é: execute o detector de rostos de sua preferência, pegue a melhor caixa delimitadora, chame este estimador e depois passe a região retornada a um cortador real, como a capacidade image.crop ou o seu próprio worker de miniaturas. Como o estimador nunca toca nos bytes da imagem, você também pode usá-lo apenas com metadados — por exemplo, para decidir, antes de baixar qualquer coisa, se um rosto detectado perto da borda renderá um quadrado utilizável ou se deve recorrer a outro layout.
O parâmetro de margem é o seu único ajuste: 0 produz um quadrado justo exatamente ao redor do maior lado do rosto, 0.25 é o enquadramento padrão para retratos e 0.5 ou mais deixa espaço para cabelo e ombros.
Casos de uso
Gerar avatares quadrados a partir de uploads
Pegue a caixa facial do seu detector e obtenha o quadrado exato para alimentar o seu worker de corte, com uma margem que sobrevive a uma máscara circular.
Pré-validar um pipeline de miniaturas
Valide caixas faciais e calcule regiões de corte apenas com metadados, antes de pagar o custo de decodificar e recodificar uma única imagem.
Auditar cortes automatizados
Armazene a região estimada junto a cada ativo, para que um avatar mal enquadrado possa ser rastreado até as coordenadas exatas que o produziram.
Perguntas frequentes
Quanto custa?
Também é gratuito no seu navegador nesta página, com exatamente o mesmo resultado.
Preciso enviar a imagem?
Não. Apenas as dimensões da imagem e a caixa delimitadora do rosto são enviadas — seis números. Nenhum dado de pixel é transmitido, processado ou armazenado.
O que acontece se a caixa facial ultrapassar a imagem?
Uma caixa facial fora da imagem é quase sempre um bug de detecção ou de mapeamento de coordenadas, e ela é reportada em vez de cortada silenciosamente.
E se o quadrado ultrapassar uma borda?
O quadrado é deslocado de volta para dentro da imagem mantendo seu tamanho e, se for maior que a própria imagem, é reduzido à menor dimensão dela. A região retornada está sempre totalmente dentro dos limites.
O que a margem faz?
Ela adiciona espaço ao redor do rosto como uma fração do seu maior lado. O padrão 0.25 gera um quadrado 1.5 vezes o maior lado do rosto; 0 produz um corte justo e 0.5 deixa espaço generoso.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"width": 1200,
"height": 900,
"face_x": 400,
"face_y": 250,
"face_width": 200,
"face_height": 240
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.crop_face_center_estimate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 15 |
max_megapixels | 12 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Funciona gratuitamente no seu navegador nesta página e via API por US$ 0,002 por chamada.
Por que estimar o corte antes de cortar
A resposta é um simples objeto JSON com x, y e lado, que você pode entregar a qualquer ferramenta de corte, do ImageMagick a um elemento canvas, ou armazenar junto ao ativo para que a decisão seja auditável. Como o cálculo é aritmética pura sobre seis números, custa quase nada, responde em microssegundos e se comporta de forma idêntica no navegador e na API, permitindo prototipar interativamente e automatizar depois, sem conferir novamente nenhum resultado.
Como a região é calculada
A própria caixa facial é validada rigorosamente: origens negativas, tamanhos não positivos e caixas que ultrapassam as bordas da imagem geram um erro invalid_input, em vez de produzir silenciosamente um corte quebrado, pois uma caixa facial fora da imagem é um bug do detector sobre o qual você quer ser avisado.
Onde ele se encaixa em um pipeline
Tudo roda na nossa edge global sem armazenar nada, e o mesmo módulo alimenta a calculadora gratuita desta página, de modo que o número que você vê no navegador é, byte a byte, o número que a API retorna quando você automatiza a chamada.
Perguntas técnicas
O resultado é determinístico?
Sim. É aritmética pura: mesma entrada, mesmas coordenadas, no navegador e na API, sem aleatoriedade, relógios ou rede envolvidos.