Měl jsem to přesně stejný problém předtím.
Neváhejte a zkopírujte, co jsem udělal, a doufám, že vám to pomůže / vyřeší váš problém.
Jak jsem to vyřešil
Můj první nápad, který selhal, podobně jako si možná myslíte, je, že jsem nakonec vytvořil řetězce pro každý jednotlivý obrázek (bez ohledu na velikost). Ale rychle jsem zjistil, že to zaplňuje vaši databázi super rychle a nebylo to efektivní.
Další možností (která funguje) byl menší obrázek (jako váš 5px
idea) a udělal jsem přesně to, ale s 10px
*10px
snímky. Způsob, jakým jsem vytvořil 'hash' pro každý obrázek, byl imagecolorat()
funkce.
Při příjmu rgb
barvy pro obrázek jsem je zaokrouhlil na nejbližších 50
, takže barvy byly méně konkrétní. Toto číslo (50
) je to, co chcete změnit v závislosti na tom, jak konkrétní chcete, aby vaše vyhledávání byla.
například:
// Pixel RGB
rgb(105, 126, 225) // Original
rgb(100, 150, 250) // After rounding numbers to nearest 50
Poté, co to uděláte pro každý pixel (10px
*10px
vám dá 100 rgb()
's back), pak jsem je přeměnil na pole a uložil je do databáze jako base64_encode()
a serialize()
.
Při hledání obrázků, které jsou podobné, jsem provedl přesně stejný proces jako u obrázku, který chtěli nahrát, a poté jsem extrahoval „hash“ obrázku z databáze, abych je všechny porovnal a zjistil, co odpovídá zaoblenému rgb
's.
Tipy
-
Větší že
50
je vrgb
zaokrouhlení, méně konkrétní vaše vyhledávání bude (a naopak). -
Pokud chcete svůj SQL abychom byli konkrétnější, může být lepší uložit extra/specific informace o obrázku v databázi, abyste mohli omezit vyhledávání v databázi. např. . pokud je poměr stran
4:3
, vytáhněte obrázky pouze kolem4:3
z databáze. (atd.) -
Může být obtížné získat dokonale
5px
*5px
, takže návrh je phpthumb . Použil jsem to se syntaxí:
Hodně štěstí, kámo, doufám, že vám mohu pomoci.