Php - zastąp podstawowy kolor przezroczystego obrazu png

Szukałem dużo i znalazłem tylko kilka rozwiązań (w google i stackoverflow, więc proszę nie zaznaczać tego jako duplikatu, chyba że jest naprawdę powielone pytanie), ale problemy są twardymi krawędziami. Czy istnieje jakikolwiek właściwy sposób zmiany koloru bazowego, powiedzmy czarny obraz png z przezroczystym tłem, ale aby zachować miękkie krawędzie?

To jest przykładowy obraz:

Chcę, żeby wyglądało to tak:

ale rozwiązania, które znalazłem, dają mi ten:

Ponieważ będę używał tego na moim lokalnym serwerze, tylko do użytku osobistego, doceniana jest każda biblioteka php, która może pomóc w osiągnięciu tego celu.

AKTUALIZACJA:

To jest funkcja, która daje mi trzeci obraz:

function LoadPNG($imgname)
{
    $im = imagecreatefrompng ($imgname);
    imagetruecolortopalette($im,false, 255);
    $index = imagecolorclosest ( $im,  0,0,0 ); // GET BLACK COLOR
    imagecolorset($im,$index,0,150,255); // SET COLOR TO BLUE
    $name = basename($imgname);
    imagepng($im, getcwd()."/tmp/$name" ); // save image as png
    imagedestroy($im);
}
$dir = getcwd()."/img/";
$images = glob($dir."/*.png",GLOB_BRACE);
foreach($images as $image) {
    LoadPNG($image);
}

Pierwotnie funkcja ta była rozwiązaniem dla obrazów GIF (paleta 255 kolorów), więc myślę, że dlatego są twarde krawędzie. Szukam rozwiązania (ulepszenia tego skryptu), aby zachować przejrzystość i miękkie krawędzie obrazu PNG.

EDYCJA 2:

Znalazłem tutaj interesujące podejście, używając płótna HTML5 i javascript tutaj:http://users7.jabry.com/overlord/mug.html

Może ktoś może mieć pomysł, jak przetłumaczyć to na PHP, jeśli to możliwe.

NOWE ROZWIĄZANIE

W odpowiedziach

questionAnswers(5)

yourAnswerToTheQuestion