Jag har haft det exakt samma fråga tidigare.
Kopiera gärna vad jag gjorde, och förhoppningsvis kommer det att hjälpa dig/lösa ditt problem.
Hur jag löste det
Min första idé som misslyckades, liknande vad du kanske tänker, är att jag gjorde strängar för varje enskild bild (oavsett vilken storlek). Men jag kom snabbt fram till att detta fyller din databas supersnabbt och var inte effektivt.
Nästa alternativ (som fungerar) var en mindre bild (som din 5px
). idé), och jag gjorde precis det, men med 10px
*10px
bilder. Sättet jag skapade "hash" för varje bild var imagecolorat()
funktion.
När du tar emot rgb
färgerna för bilden, avrundade jag dem till närmaste 50
, så att färgerna var mindre specifika. Det numret (50
) är vad du vill ändra beroende på hur specifik du vill att dina sökningar ska vara.
till exempel:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Efter att ha gjort detta till varje pixel (10px
*10px
ger dig 100 rgb()
är tillbaka), gjorde jag dem sedan till en array och lagrade dem i databasen som base64_encode()
och serialize()
.
När jag sökte efter bilder som liknar varandra, gjorde jag exakt samma process för bilden de ville ladda upp och extraherade sedan bildhashar från databasen för att jämföra dem alla och se vad som matchade avrundad rgb s.
Tips
-
Den Större att
50
finns irgb
avrundning, det mindre specifika din sökning blir (och vice versa). -
Om du vill ha din SQL för att vara mer specifik kan det vara bättre att lagra extra/specifikt info om bilden i databasen, så att du kan begränsa sökningarna du får i databasen. t.ex. . om bildförhållandet är
4:3
, dra bara bilder runt4:3
från databasen. (etc) -
Det kan vara svårt att få den här perfekta
5px
*5px
, så ett förslag är phpthumb . Jag använde den med syntaxen:
Lycka till kompis, hoppas jag kunde hjälpa.