Ho avuto questo esatto stesso problema prima.
Sentiti libero di copiare ciò che ho fatto e, si spera, ti aiuterà a risolvere il tuo problema.
Come l'ho risolto
La mia prima idea che ha fallito, simile a quello che potresti pensare, è che ho finito per creare stringhe per ogni singola immagine (indipendentemente dalle dimensioni). Ma ho subito capito che questo riempie il tuo database in modo super veloce e non era efficace.
La prossima opzione (che funziona) era un'immagine più piccola (come il tuo 5px
idea), e l'ho fatto esattamente, ma con 10px
*10px
immagini. Il modo in cui ho creato l''hash' per ogni immagine è stato imagecolorat()
funzione.
Quando si riceve il rgb
colori per l'immagine, li ho arrotondati al 50
più vicino , in modo che i colori fossero meno specifici. Quel numero (50
) è ciò che vuoi cambiare a seconda di quanto specifico vuoi che siano le tue ricerche.
ad esempio:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Dopo aver eseguito questa operazione su ogni pixel (10px
*10px
ti darà 100 rgb()
's back), li ho quindi trasformati in un array e li ho archiviati nel database come base64_encode()
e serializza()
.
Durante la ricerca di immagini simili, ho eseguito lo stesso identico processo per l'immagine che volevano caricare, quindi ho estratto gli "hash" dell'immagine dal database per confrontarli tutti e vedere cosa aveva rgb
Suggerimenti
-
Il Più grande quel
50
è nelrgb
arrotondamento, il meno specifico la tua ricerca sarà (e viceversa). -
Se vuoi il tuo SQL per essere più specifici, potrebbe essere meglio memorizzare extra/specifico informazioni sull'immagine nel database, in modo da poter limitare le ricerche che ottieni nel database. ad esempio . se le proporzioni sono
4:3
, trascina le immagini solo intorno a4:3
dalla banca dati. (ecc) -
Può essere difficile ottenere perfettamente questo
5px
*5px
, quindi un suggerimento è phpthumb . L'ho usato con la sintassi:
Buona fortuna amico, spero di poterti aiutare.