Overlay PNG on JPEG with Transparency (Watermark) in PHP GD

This example is a common way to overlay png watermarks and stamps to photos and copyrighted images using PHP using GD library and imagecopy.

By Tim TrottPHP Tutorials • July 31, 2010
Overlay PNG on JPEG with Transparency (Watermark) in PHP GD

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.

Vantage point on the way towards Llanberis
Vantage point on the way towards Llanberis

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.

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

Related ArticlesThese articles may also be of interest to you

CommentsShare your thoughts in the comments below

My website and its content are free to use without the clutter of adverts, popups, marketing messages or anything else like that. 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?

New comments for this post are currently closed.