Php - заменить базовый цвет прозрачного изображения PNG

Я много искал и нашел только несколько решений (на google и stackoverflow, поэтому, пожалуйста, непометить этот как дубликат, если нетЭто действительно дублирующий вопрос), но проблемы - это острые края. Есть ли какой-нибудь правильный способ изменить базовый цвет, пустьскажем, черная форма PNG изображения с прозрачным фоном, но чтобы сохранить мягкие края?

Это пример изображения:

Я хочу, чтобы это выглядело так:

но решения, которые я нашел, дают мне это:

Так как я буду использовать это на своем локальном хосте, только для личного использования, любая библиотека php, которая может помочь в достижении этого, приветствуется.

ОБНОВИТЬ:

Это функция, которая дает мне 3-е изображение:

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);
}

Первоначально эта функция была решением для GIF-изображений (палитра из 255 цветов), поэтому я думаю, чтопочему есть жесткие края? Я ищу решение (улучшение этого сценария), чтобы сохранить прозрачность и мягкие края изображения PNG.

РЕДАКТИРОВАТЬ 2:

Я нашел интересный подход, используя html5 canvas и javascript здесь:http://users7.jabry.com/overlord/mug.html

Возможно, у кого-то может быть идея, как перевести это на PHP, если это возможно.

НОВОЕ РЕШЕНИЕ

В ответах

Ответы на вопрос(5)

Ваш ответ на вопрос