[PHP] Jak w grafice zmienić wybrane kolory na inne?
Chcesz zmienić paletę kolorów w dowolnym obrazku lub wymienić na inne tylko określone kolory, jak w przykładzie:
Często się zdarza, że w obrazkach trzeba wymienić określone kolory. Jeżeli nie chcesz mieć żółtego napisu, możesz zrobić czerwony (np. na czas walentynek), kiedy indziej możesz wykonać kolory dopasowane do pogody czy pory dnia lub wielkości zamówienia w sklepie internetowym.
Możliwości jest wiele. Naszym celem jest pobranie obrazka oryginalnego, zamiana dowolnych kolorów podanych jako składowe RGB na inne i zapisanie obrazka pod inną (lub tą samą) nazwą w katalogu. Efekty zamiany kilku kolorów widzisz w powyższym przykładzie.
Skrypt jest uniwersalny i bardzo łatwy w obsłudze, zobacz:
<?
$kolory = array(
array(255,0,0, 0,0,0), // czerwony na czarny
array(0,0,0, 255,255,255), // czarny na biały
array(0,255,0, 255,255,0), // zielony na żółty
array(255,255,0, 153,153,153) // żółty na szary
);
$img=ImageCreateFromPNG("klip1.png");
for ($i=0; $i<ImageColorsTotal($img); $i++) {
$c = ImageColorsForIndex($img, $i);
foreach ($kolory as $k) {
if ($c["red"]==$k[0] and $c["green"]==$k[1] and $c["blue"]==$k[2])
ImageColorSet($img, $i, $k[3], $k[4], $k[5]);
}
}
ImagePNG($img,"klip2.png");
ImageDestroy($img);
?>
<img src="klip1.png">
<img src="klip2.png">
W tablicy z kolorami, jako pierwsze w linii podajesz wartości RGB koloru zamienianego, a jako drugie koloru, jaki ma go zastąpić. Pierwsza linijka w tablicy to tablica kolorów: czerwonego (255,0,0), który stanie się czarnym (0,0,0). Możesz dodawać dowolną ilość par kolorów do zamiany.
Po wczytaniu obrazka klip1.png, w pętli for pobieramy ilość kolorów w palecie za pomocą ImageColorsTotal() i przechodzimy przez pętle tyle razy ile jest kolorów.
W pętli pobieramy kolejny kolor z palety za pomocą ImageColorsForIndex() i składowe tego koloru umieszczamy w tablicy asocjacyjnej $c. Teraz sprawdzamy, czy taki kolor jest w naszej tablicy kolorów do podmiany. Jeżeli tak, za pomocą ImageColorSet() przypisujemy mu nowy kolor.
Następnie można już zapisać plik na dysk za pomocą ImagePNG() i usunąć plik z pamięci za pomocą ImageDestroy(). I oto mamy drugi plik, w którym kolory są zamienione zgodnie z naszymi ustaleniami. Można je teraz wstawić na stronę za pomocą elementów img.