Imagens duplicadas no acervo?
Gere o hash perceptual (pHash) de uma imagem: uma impressão digital que continua parecida mesmo quando a foto é redimensionada, comprimida ou levemente editada. Comparando hashes, você encontra duplicadas e quase duplicadas em qualquer acervo. Grátis, no navegador, sem enviar o arquivo.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Por que o hash comum não acha foto parecida
Um hash tradicional, como os usados para conferir arquivos, muda por completo se um único pixel mudar — a mesma foto salva em outra qualidade vira, para ele, um arquivo totalmente diferente. O hash perceptual funciona ao contrário: ele resume o que a imagem mostra, não os bytes do arquivo. A mesma foto redimensionada, recomprimida ou com marca discreta gera um pHash igual ou muito próximo do original. É essa propriedade que transforma a comparação de imagens num problema de comparar códigos curtos.
Como achar as duplicadas de verdade
O fluxo é simples: gere o pHash de cada imagem do acervo e compare os códigos entre si — quanto menor a diferença entre dois hashes, mais parecidas as imagens. Códigos idênticos indicam a mesma foto em versões diferentes; códigos próximos indicam variações, como o mesmo produto com corte diferente. Com os hashes gravados no banco, verificar se uma imagem nova “já existe” custa uma consulta, não uma comparação visual com milhares de arquivos.
No navegador, sem mandar nada para fora
Nesta página, o cálculo do pHash roda localmente: você escolhe o arquivo, o código aparece, e a imagem permanece no seu aparelho. Sem upload, sem cadastro, sem limite — dá para gerar o hash de dezenas de fotos e comparar na mão, o que resolve limpezas pontuais de pasta e testes da técnica antes de integrar qualquer coisa.
Milhares de imagens? Automatize
Para acervos grandes e verificação contínua — todo upload checado contra o que já existe —, a geração do pHash roda por API, a US$ 0,002 por chamada, pagos por uso. Marketplaces usam para bloquear anúncio com foto repetida; bancos de imagem, para deduplicar coleções; equipes de conteúdo, para achar a arte original entre dez variações espalhadas.
Casos de uso
Catálogo herdado cheio de repetição
A Distribuidora Horizonte Verde migrou três sistemas antigos e herdou 40.000 fotos de produto — muitas repetidas em tamanhos diferentes. Com o pHash de cada uma, as duplicadas aparecem agrupadas e a limpeza vira tarefa de uma tarde.
Anúncio repetido no marketplace
Uma plataforma de classificados calcula o pHash de cada foto no momento do anúncio. Se o código bate com o de um anúncio ativo, o sistema sinaliza possível repostagem antes de publicar.
Achar a arte original entre as cópias
O time de marketing tem a mesma peça salva em cinco pastas, com nomes diferentes e leves variações. Comparando os hashes, Carlos Eduardo Souza identifica quais são de fato o mesmo arquivo e mantém só a versão-mestre.
Perguntas frequentes
Qual a diferença entre pHash e um hash como o de verificação de arquivos?
O hash de arquivo muda inteiro a qualquer alteração de byte; o perceptual resume o conteúdo visual e se mantém próximo quando a imagem é redimensionada ou recomprimida. Para achar fotos parecidas, só o perceptual serve.
Ele encontra imagens editadas, ou só cópias exatas?
Encontra variações leves — compressão, redimensionamento, pequenos cortes. Edições pesadas, como mudar o fundo inteiro, afastam os hashes e podem escapar.
Minhas fotos são enviadas para algum servidor?
Na página, não: o cálculo roda no seu navegador e só o código aparece. É grátis e sem cadastro.
Como uso isso num sistema com muitos uploads?
Gere o pHash de cada imagem via API no upload, grave no banco e compare os códigos novos com os existentes. Cada chamada custa US$ 0,002, pago por uso.
O pHash identifica o que aparece na foto?
Não — ele não sabe se a imagem tem um carro ou um bolo. É uma impressão digital para comparação, não uma análise de conteúdo.
Que tamanho de arquivo é aceito?
Até 15 MB e 12 megapixels por imagem, nos formatos comuns de foto.
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/phash \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"image":"https://ejemplo.com/imagen.jpg"}'const res = await fetch("https://api.kit.forhosting.com/image/phash", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"image": "https://ejemplo.com/imagen.jpg"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/phash",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"image": "https://ejemplo.com/imagen.jpg"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/phash", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"image":"https://ejemplo.com/imagen.jpg"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"image":"https://ejemplo.com/imagen.jpg"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/phash", 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
{
"image": "https://ejemplo.com/imagen.jpg"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.phash",
"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. |