54

I have a website where users may upload images...

I need to add my logo (watermark) to the images once they are uploaded.

How can I do so?

And it is important that the watermark is in a corner where it will be visible, for example I have seen websites which generates a watermark on the fly, and puts the mark wherever the background of the main image is "the same color" so the watermark sticks out if you know what I mean.

Anybody have a good tutorial or article about this? Or know of any function in php which I would need to find the position of the watermark?

Sandesh
  • 1,190
  • 3
  • 23
  • 41
pesar
  • 929
  • 3
  • 10
  • 13
  • you can use this solution :: https://stackoverflow.com/questions/8829674/adding-watermark-to-image-in-php/60740632#60740632 – pankaj Mar 18 '20 at 13:34

7 Answers7

59

A good example in the PHP manual:

// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpeg');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
Josh
  • 8,082
  • 5
  • 43
  • 41
XUE Can
  • 701
  • 6
  • 8
24

use this function
the type of watermark image must be "png"

 function watermark_image($target, $wtrmrk_file, $newcopy) {
    $watermark = imagecreatefrompng($wtrmrk_file);
    imagealphablending($watermark, false);
    imagesavealpha($watermark, true);
    $img = imagecreatefromjpeg($target);
    $img_w = imagesx($img);
    $img_h = imagesy($img);
    $wtrmrk_w = imagesx($watermark);
    $wtrmrk_h = imagesy($watermark);
    $dst_x = ($img_w / 2) - ($wtrmrk_w / 2); // For centering the watermark on any image
    $dst_y = ($img_h / 2) - ($wtrmrk_h / 2); // For centering the watermark on any image
    imagecopy($img, $watermark, $dst_x, $dst_y, 0, 0, $wtrmrk_w, $wtrmrk_h);
    imagejpeg($img, $newcopy, 100);
    imagedestroy($img);
    imagedestroy($watermark);
}

watermark_image('image_name.jpg','watermark.png', 'new_image_name.jpg');
Dhaval Bharadva
  • 3,053
  • 2
  • 24
  • 35
iraqi_love4ever
  • 583
  • 1
  • 5
  • 3
12

Good Example of watermark image and positioned at the center

<?php
// Load the stamp and the photo to apply the watermark to
$stamp = imagecreatefrompng('stampimg.png');
$im = imagecreatefrompng('mainimage.png');

// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

$imgx = imagesx($im);
$imgy = imagesy($im);
$centerX=round($imgx/2);
$centerY=round($imgy/2);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 
imagecopy($im, $stamp, $centerX, $centerY, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Sailee Shahir
  • 129
  • 1
  • 2
3

I found a much better solution which add a watermark dinamically through .htaccess, you can find the tutorial here:

Add watermark to images through htaccess

After uploading the custom .htaccess file, the watermark.php scrypt, and your watermark.png image, all the images in the folder and its subfolders will show the watermark, however, you will still keep the original file in the server.

Hope that helps someone the same that it helped to me.

Alberto S.
  • 1,805
  • 23
  • 39
  • Good solution as it's easy but it's a requiring more server resources as it treats image over and over (on each display) in place of doing it once and for all. it can make a big difference on websites with big traffic. – Mathias Philippe Aug 04 '13 at 10:37
  • this is not a good solution, every time that user reload page, this script will be load.. more server resources... – Dante Cervantes Feb 03 '18 at 18:47
  • It is kind of a temporal solution. The good thing is that you can implement it without touching the module code. However, more effort will be needed in sites with big traffic – Alberto S. Feb 06 '18 at 13:39
2
// Load the stamp and the photo to apply the watermark to

$stamp = imagecreatefrompng('stamp.png');
$im = imagecreatefromjpeg('photo.jpg');
$save_watermark_photo_address = 'watermark_photo.jpg';

// Set the margins for the stamp and get the height/width of the stamp image

$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx($stamp);
$sy = imagesy($stamp);

// Copy the stamp image onto our photo using the margin offsets and the photo 
// width to calculate positioning of the stamp. 

imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

// Output and free memory
// header('Content-type: image/png');

imagejpeg($im, $save_watermark_photo_address, 80); 
imagedestroy($im);
Baz Love
  • 61
  • 3
2

This can be done using an image manipulation library such as GD or ImageMagick. Here is a tutorial that explains a way to do it using GD:

http://articles.sitepoint.com/article/watermark-images-php

Jimmy
  • 35,686
  • 13
  • 80
  • 98
  • Hi I have also issue, it gives me resource id and I can't able to upload it, means move_uploaded_file does not works please help me to resolve it. – JayDeep Nimavat Jun 07 '16 at 18:20
2

ImageMagick works well for that. I've done it before. The whole business is a bit of a pain, though. Especially if you want fancy blending modes and the like.

Gabriel Hurley
  • 39,690
  • 13
  • 62
  • 88