2011-10-11 6 views
25

Jak wykryć dwa górne kolory obrazu w PHP?Wykrywanie kolorów obrazu przy użyciu PHP

na przykład mam ten obraz:

enter image description here

Funkcja/proces powrotu: 0000FF lub niebieskie i FFFF00 lub YELLOW

Thanks

+2

To może być coś dla Ciebie: http://stackoverflow.com/questions/3468500/detect-overall-average-color-of-the-picture – samn

+0

dzięki, to jest niesamowite. Czy możesz to wyrazić jako odpowiedź? – Tech4Wilco

Odpowiedz

20

Tutaj jest scr IPT że daje listę:

function detectColors($image, $num, $level = 5) { 
    $level = (int)$level; 
    $palette = array(); 
    $size = getimagesize($image); 
    if(!$size) { 
    return FALSE; 
    } 
    switch($size['mime']) { 
    case 'image/jpeg': 
     $img = imagecreatefromjpeg($image); 
     break; 
    case 'image/png': 
     $img = imagecreatefrompng($image); 
     break; 
    case 'image/gif': 
     $img = imagecreatefromgif($image); 
     break; 
    default: 
     return FALSE; 
    } 
    if(!$img) { 
    return FALSE; 
    } 
    for($i = 0; $i < $size[0]; $i += $level) { 
    for($j = 0; $j < $size[1]; $j += $level) { 
     $thisColor = imagecolorat($img, $i, $j); 
     $rgb = imagecolorsforindex($img, $thisColor); 
     $color = sprintf('%02X%02X%02X', (round(round(($rgb['red']/0x33)) * 0x33)), round(round(($rgb['green']/0x33)) * 0x33), round(round(($rgb['blue']/0x33)) * 0x33)); 
     $palette[$color] = isset($palette[$color]) ? ++$palette[$color] : 1; 
    } 
    } 
    arsort($palette); 
    return array_slice(array_keys($palette), 0, $num); 
} 

$img = 'icon.png'; 
$palette = detectColors($img, 6, 1); 
echo '<img src="' . $img . '" />'; 
echo '<table>'; 
foreach($palette as $color) { 
    echo '<tr><td style="background:#' . $color . '; width:36px;"></td><td>#' . $color . '</td></tr>'; 
} 
echo '</table>'; 
+5

Po prostu skopiowałeś kod strony, do której się zwracałem. Sposób na ... – samn

+3

i dodałem poprawkę, ale tak, masz rację: – rcs20

+4

Zoptymalizuję to poprzez zastąpienie Case'a przełącznikiem '$ img = @imagecreatefromstring (file_get_contents ($ image));' dzięki czemu możesz przetwarzać różne typy obrazów wydajnie ... – Andres

0

Jeśli jesteś OK wywołać narzędzie zewnętrznego Imagemagick może wygenerować histogram dla ciebie. Prawdopodobnie będzie to znacznie szybsze niż implementacja PHP.

Zasadniczo, to polecenie daje listę kolorów, posortowane według najbardziej dominującym pierwsze:

convert 'http://i.stack.imgur.com/J2txV.png' -format %c histogram:info:-|sort -r 

może chcesz najpierw odwzorować obraz do stałej palecie („zaokrąglać” kolory). To co mam użyć:

convert 'http://i.stack.imgur.com/J2txV.png' -modulate 100,200,100 -remap 'http://i.stack.imgur.com/GvTqB.png' -format %c histogram:info:-|sort -r