Eu tive isso exato mesma questão antes.
Sinta-se à vontade para copiar o que eu fiz, e espero que isso ajude/resolva seu problema.
Como resolvi
Minha primeira ideia que falhou, semelhante ao que você pode estar pensando, é que acabei fazendo strings para cada imagem (não importa o tamanho). Mas eu rapidamente descobri que isso enche seu banco de dados super rápido e não foi eficaz.
A próxima opção (que funciona) era uma imagem menor (como seu
5px
ideia), e fiz exatamente isso, mas com 10px
*10px
imagens. A maneira como criei o 'hash' para cada imagem foi o imagecolorat()
função. Veja php.net aqui.
Ao receber o
rgb
cores para a imagem, eu as arredondamos para o 50
mais próximo , para que as cores fossem menos específicas. Esse número (50
) é o que você deseja alterar dependendo de quão específico você deseja que suas pesquisas sejam. por exemplo:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Depois de fazer isso para cada pixel (
10px
*10px
lhe dará 100 rgb()
's back), eu os transformei em um array e os armazenei no banco de dados como base64_encode()
e serialize()
. Ao fazer a pesquisa de imagens semelhantes, fiz exatamente o mesmo processo para a imagem que eles queriam enviar e, em seguida, extraí os 'hashes' da imagem do banco de dados para compará-los todos e ver o que correspondia ao
rgb 's.
Dicas
-
O maior que 50
está no rgb
arredondamento, o menos específico sua pesquisa será (e vice-versa).
-
Se você deseja que seu SQL para ser mais específico, pode ser melhor armazenar extra/específico informações sobre a imagem no banco de dados, para que você possa limitar as pesquisas feitas no banco de dados. por exemplo . se a proporção for 4:3
, apenas extraia imagens em torno de 4:3
do banco de dados. (etc)
-
Pode ser difícil obter isso perfeitamente 5px
*5px
, então uma sugestão é phpthumb
. Eu usei com a sintaxe:
Boa sorte amigo, espero ter ajudado.