Crie um layout para comparar imagens antes e depois
Crie um layout preciso de comparação de imagens antes e depois sem estimar coordenadas no código da interface.
Executar grátis
Informe as dimensões em pixels das duas imagens, escolha uma apresentação lado a lado ou uma sobreposição com controle deslizante e receba o canvas, os retângulos, as regiões de recorte e a posição do divisor vertical como dados estruturados. Esperam-se dimensões iguais, pois uma comparação visual confiável depende de conteúdo alinhado. Quando as imagens de origem forem diferentes, você poderá solicitar explicitamente uma instrução para redimensionar a imagem posterior conforme a anterior.
Escolha o formato de comparação adequado à narrativa
Uma apresentação de antes e depois atende a duas necessidades de visualização. Um layout de comparação de imagens lado a lado mantém cada imagem inteiramente visível, o que ajuda quando o público precisa examinar a cena completa, comparar áreas distantes ou ver o resultado sem interação. O canvas retornado tem o dobro da largura efetiva da imagem, com o painel anterior à esquerda, o posterior à direita e um divisor vertical no limite comum. Já a sobreposição com controle deslizante coloca as duas imagens no mesmo sistema de coordenadas. Seus retângulos de recorte complementares exibem a imagem anterior à esquerda do divisor e a posterior à direita. Esse formato facilita a localização de pequenas mudanças, pois os elementos correspondentes continuam no mesmo ponto enquanto o divisor se move. Escolha o modo conforme o público e a interface e aplique os retângulos diretamente em CSS, SVG, Canvas ou em uma camada de renderização nativa. As coordenadas usam pixels inteiros, sem convenções ocultas para reconstruir depois.
Trate as dimensões de forma explícita
Comparações confiáveis começam com dimensões iguais. Se uma imagem tiver 1200 por 800 pixels e a outra 1000 por 800, colocá-las na mesma sobreposição sem uma transformação declarada deslocará detalhes correspondentes e poderá exagerar ou esconder mudanças. Por isso, a calculadora rejeita larguras ou alturas diferentes, a menos que `resize_to_match` esteja ativado. Com essa opção, a imagem anterior se torna o destino canônico, e o resultado inclui as dimensões de destino da imagem posterior e fatores independentes de escala horizontal e vertical. Essa política informa exatamente qual ajuste o renderizador deve aplicar e permite identificar distorções não uniformes. A ferramenta não realiza o redimensionamento nem escolhe um corte. Se a proporção precisar ser preservada, prepare fontes coincidentes ou recorte-as em um fluxo de imagem antes de pedir o layout. Quando as dimensões já forem iguais, o objeto de redimensionamento apenas indicará que nenhuma alteração é necessária, mantendo uma estrutura previsível sem campos nulos opcionais.
Transforme a saída do divisor em uma interface funcional
Na sobreposição, informe uma porcentagem de divisor entre zero e cem. A calculadora a converte para o pixel mais próximo no canvas e devolve dois recortes cujas larguras sempre somam a largura total. Em zero por cento, o recorte anterior tem largura zero e a imagem posterior aparece por completo; em cem por cento ocorre o inverso. A porcentagem original também é devolvida para o estado da interface, valores de acessibilidade, análises ou novo cálculo após um redimensionamento responsivo. No modo lado a lado, dois painéis de largura completa definem naturalmente o divisor no centro do canvas combinado, independentemente da porcentagem informada. Use a orientação e a coordenada x para posicionar uma linha, uma alça ou um controle operável por teclado. Um controle de produção deve comunicar seu valor às tecnologias assistivas, aceitar as setas e identificar os lados anterior e posterior. Como a capacidade devolve geometria, e não marcação, o mesmo resultado determinístico pode alimentar um componente web, um gráfico social, uma prévia de design system ou um aplicativo móvel.
Casos de uso
Documentar uma reforma
Organize fotos alinhadas de um ambiente em painéis completos adjacentes ou em um controle interativo de revelação.
Apresentar uma edição de imagem
Gere recortes exatos para prévias de retoque, restauração, correção de cor ou remoção de fundo.
Padronizar componentes de comparação
Forneça aos renderizadores web e móveis o mesmo canvas, retângulos, plano de ajuste e divisor determinísticos.
Perguntas frequentes
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. A ferramenta desta página é gratuita no navegador.
A ferramenta modifica ou envia minhas imagens?
Não. Ela recebe somente dimensões e devolve coordenadas; não lê, transfere, armazena nem renderiza os bytes das imagens.
O que acontece quando as dimensões são diferentes?
A solicitação retorna um erro de entrada inválida, exceto quando resize_to_match é verdadeiro. Se ativado, o resultado descreve como ajustar a imagem posterior às dimensões da anterior.
Como o pixel do divisor é calculado?
A largura da imagem é multiplicada pela porcentagem solicitada, dividida por 100 e arredondada para o pixel inteiro mais próximo.
A porcentagem afeta o modo lado a lado?
Não. Esse modo mostra dois painéis completos de mesmo tamanho, portanto o divisor fica sempre em 50 por cento do canvas combinado.
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/compare-before-after-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"before_width":1200,"before_height":800,"after_width":1200,"after_height":800}'const res = await fetch("https://api.kit.forhosting.com/image/compare-before-after-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"before_width": 1200,
"before_height": 800,
"after_width": 1200,
"after_height": 800
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/compare-before-after-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"before_width": 1200,
"before_height": 800,
"after_width": 1200,
"after_height": 800
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/compare-before-after-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"before_width":1200,"before_height":800,"after_width":1200,"after_height":800}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"before_width":1200,"before_height":800,"after_width":1200,"after_height":800}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/compare-before-after-layout", 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
{
"before_width": 1200,
"before_height": 800,
"after_width": 1200,
"after_height": 800
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.compare_before_after_layout",
"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. |