Miałem to dokładne ten sam problem wcześniej.
Możesz skopiować to, co zrobiłem i mam nadzieję, że pomoże ci to / rozwiązać twój problem.
Jak to rozwiązałem
Mój pierwszy pomysł, który się nie powiódł, podobny do tego, o czym myślisz, polega na tym, że stworzyłem ciągi dla każdego pojedynczego obrazu (bez względu na rozmiar). Ale szybko się zorientowałem, że to bardzo szybko wypełnia twoją bazę danych i nie jest skuteczne.
Następną opcją (która działa) był mniejszy obraz (np. Twój 5px
pomysł) i dokładnie to zrobiłem, ale z 10px
*10px
obrazy. Sposób, w jaki stworzyłem „hash” dla każdego obrazu, to imagecolorat()
funkcja.
Po otrzymaniu rgb
kolory obrazu, zaokrągliłem je do najbliższych 50
, aby kolory były mniej specyficzne. Ten numer (50
) jest tym, co chcesz zmienić w zależności od szczegółowości chcesz, aby Twoje wyszukiwania były.
na przykład:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Po wykonaniu tej czynności do każdego piksela (10px
*10px
da ci 100 rgb()
's back), następnie przekształciłem je w tablicę i zapisałem w bazie danych jako base64_encode()
i serialize()
.
Podczas wyszukiwania obrazów, które są podobne, wykonałem dokładnie ten sam proces dla obrazu, który chcieli przesłać, a następnie wyodrębniłem „hasze” obrazu z bazy danych, aby je wszystkie porównać i zobaczyć, co pasowało zaokrąglone rgb s.
Wskazówki
-
Większy że
50
jest wrgb
zaokrąglanie, mniej szczegółowe Twoje wyszukiwanie będzie (i odwrotnie). -
Jeśli chcesz mieć swój SQL dokładniej, lepiej przechowywać dodatkowe/specyficzne informacje o obrazie w bazie danych, dzięki czemu możesz ograniczyć wyszukiwania w bazie danych. np. . jeśli proporcje to
4:3
, ciągnij tylko obrazy wokół4:3
z bazy danych. (itd.) -
Może być trudno uzyskać to idealnie
5px
*5px
, więc sugestia to phpthumb . Użyłem go ze składnią:
Powodzenia kolego, mam nadzieję, że pomogę.