'PHP GD - Add a color layer over a image

I want to add a color layer over a image in php using gd.

This is the image: Image

I want to overlay this with this color: #ABD0D2

I made a quick image how it should look at the end. Keep in mind that the image should still be transparent enter image description here

So far I have this code:

$img = imagecreatefrompng('image.png');

imagesavealpha($img, true);
imagefill($img, 0, 0, imagecolorallocatealpha($img, 0, 0, 0, 127));

// make overlay with new color???

imagepng($img, 'new.png');
imagedestroy($img);


Solution 1:[1]

You can create a new image, filled with your target colour, and then merge the two:

$img = imagecreatefrompng('image.png');
$w = imagesx($img);
$h = imagesy($img);
imagesavealpha($img, true);

$img2 = imagecreatetruecolor($w, $h);
imagefill($img2, 0, 0, imagecolorallocatealpha($img, 0xAB, 0xD0, 0xD2, 64));

imagecopy($img, $img2, 0, 0, 0, 0, $w, $h);

imagepng($img, 'new.png');
imagedestroy($img);
imagedestroy($img2);

Result:

enter image description here

It's not completely clear to me how you want to maintain transparency (as your expected result image isn't transparent) so in the code above I've set the 'mask' colour at 50% opacity.

Solution 2:[2]

That worked for me:

    $width = 400;
    $height = 400;
    $image = imagecreatefrompng('img.png');

    $blueOverlay = imagecreatetruecolor($width, $height);
    imagesavealpha($image, true);
    imagealphablending($image, false);
    imagesavealpha($blueOverlay, true);
    $blue = imagecolorallocatealpha($blueOverlay, 0, 0, 255, ceil(0.22 * 127));
    imagefill($blueOverlay, 0, 0, $blue);
    imagecopymerge($blueOverlay, $image, 0, 0, 0, 0, $width, $height, 70);

    imagepng($blueOverlay, 'imgWithOverlay.png');
    imagedestroy($image);
    imagedestroy($blueOverlay);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 timclutton
Solution 2