Overlay PNG on JPEG with Transparency (Watermark) in PHP GD
Last Updated May 28, 2023 by Tim Trott. First Published in 2010.

This example is a common way to overlay png watermarks and stamps to photos and copyrighted images using PHP using GD library and imagecopy.
This is the code that I use on my website to watermark my own photos. You can see an example below where the script will overlay the PNG watermark signature and copyright message in the bottom right-hand corner. The copyright year is added dynamically so each new year I upload a photo will have the current year copyright. This is much better than manually updating the signature image each year.

The function takes in two parameters - the source image filename and the destination filename to save the watermarked image. The function will work with JPEG, GIF and PNG files, however, PNG8 (265 colour PNG) does not support alpha so you would need to convert any PNG8 to PNG24 before running this. GIF only supports 256 colours so alpha will not work, but transparency does.
function GenerateWatermarkedImage($srcFilename, $destFilename)
{
list($width, $height, $type, $attr) = getimagesize($srcName);
$ext = strtolower(pathinfo($srcName, PATHINFO_EXTENSION));
// load the image based on the extension
if ($ext == 'image/png') {
$image = imagecreatefrompng($srcFilename);
} else if ($ext == 'jpg' || $ext == 'jpeg') {
$image = imagecreatefromjpeg($srcFilename);
} else if ($ext == 'gif') {
$image = imagecreatefromgif($srcFilename);
}
// set transparencey and alpha
imageinterlace($image, true);
imagealphablending($image, true);
// load the watermark
$watermarkfile = 'watermark.png';
list($watermarkWidth, $watermarkHeight, $watermarkType, $watermarkAttr) = getimagesize($watermarkfile);
$watermark = imagecreatefrompng($watermarkfile);
// add the watermark in the bottom right corner
imagecopy($image, $watermark, $width-$watermarkWidth, $height-$watermarkHeight, 0, 0, $watermarkWidth, $watermarkHeight);
// optionally add the date
$year = date("Y");
$white = imagecolorallocatealpha($image, 255, 255, 255, 0);
imagettftext($image, 8, 90, $width-6, $height-16, $white, FONT, '© '.$year);
// save the watermarked image
if ($ext == 'png') {
imagepng($image, $destFilename, 9);
} else if ($ext == 'jpg' || $ext == 'jpeg') {
imagejpeg($image, $destFilename, 80);
} else if ($ext == 'gif') {
imagegif($image, $destFilename);
}
// free up resources
if (is_resource($image)) {
imagedestroy($image);
}
if (is_resource($watermark)) {
imagedestroy($watermark);
}
}
If you enjoyed reading this article, or it helped you in some way, all I ask in return is you leave a comment below or share this page with your friends. Thank you.
There are no comments yet. Why not get the discussion started?