7

in my project i just do image watermarking or image combine it's working fine and code for that.

<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<?php
if(isset($_POST['submit']))
{
// Give the Complete Path of the folder where you want to save the image    
$folder="uploads/";
move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], "$folder".$_FILES["fileToUpload"]["name"]);
$file='uploads/'.$_FILES["fileToUpload"]["name"];

$uploadimage=$folder.$_FILES["fileToUpload"]["name"];
$newname= time();

$ext = pathinfo($_FILES["fileToUpload"]["name"], PATHINFO_EXTENSION);

// Set the thumbnail name
$thumbnail = $folder.$newname.".".$ext; 
$imgname=$newname.".".$ext;

// Load the mian image
if ($ext=="png" || $ext=="PNG") {
$source = imagecreatefrompng($uploadimage);
}
else if ($ext=="gif" || $ext=="GIF") {
$source = imagecreatefromgif($uploadimage);
}
else if ($ext=="bmp" || $ext=="BMP") {
$source = imagecreatefrombmp($uploadimage);
}
else{
$source = imagecreatefromjpeg($uploadimage);
}

// load the image you want to you want to be watermarked
$watermark = imagecreatefrompng('uploads/logo1.png');

// get the width and height of the watermark image
$water_width = imagesx($source)/2;
$water_height = imagesy($watermark);

// get the width and height of the main image image
$main_width = imagesx($source);
$main_height = imagesy($source);

$im_middle_w = $main_width/2;
$im_middle_h = $main_height/2;

// Set the dimension of the area you want to place your watermark we use 0
// from x-axis and 0 from y-axis 
$dime_x = $im_middle_w - $water_width/2;
$dime_y = $im_middle_h - $water_height/2;

// copy both the images
imagecopy($source, $watermark, $dime_x, $dime_y, 0, 0, $water_width, $water_height);

// Final processing Creating The Image
imagejpeg($source, $thumbnail, 100);
unlink($file);
}
?>
<img src='uploads/<?php echo $imgname;?>'>
</body>
</html>

but problem with setting $water_width and i want set as half of my source image. but when i have source image of less width or more width compare to $water_width it's set it like that. see image when source image width is more.

enter image description here and when width is less. enter image description here so my problem is how to set $water_width as half of source image width?

by Alex your answer it's came up like this. enter image description here

Divyesh Jesadiya
  • 1,105
  • 4
  • 30
  • 68

2 Answers2

10

This will resize watermark to half-width of original image and put it in the centre:

// load the image you want to you want to be watermarked
$watermark = imagecreatefrompng('uploads/logo1.png');

// get the width and height of the watermark image
$water_width = imagesx($watermark);
$water_height = imagesy($watermark);

// get the width and height of the main image image
$main_width = imagesx($source);
$main_height = imagesy($source);

// resize watermark to half-width of the image
$new_height = round($water_height * $main_width / $water_width / 2);
$new_width = round($main_width / 2);
$new_watermark = imagecreatetruecolor($new_width, $new_height);
// keep transparent background
imagealphablending( $new_watermark, false );
imagesavealpha( $new_watermark, true );

imagecopyresampled($new_watermark, $watermark, 0, 0, 0, 0, $new_width, $new_height, $water_width, $water_height);

// Set the dimension of the area you want to place your watermark we use 0
// from x-axis and 0 from y-axis 
$dime_x = round(($main_width - $new_width)/2);
$dime_y = round(($main_height - $new_height)/2);

// copy both the images
imagecopy($source, $new_watermark, $dime_x, $dime_y, 0, 0, $new_width, $new_height);

// Final processing Creating The Image
imagejpeg($source, $thumbnail, 100);

imagedestroy($source);
imagedestroy($watermark);
imagedestroy($new_watermark);
Alex Blex
  • 34,704
  • 7
  • 48
  • 75
  • i show image using your answer it's display black background...how to do it as other image in question? – Divyesh Jesadiya Nov 16 '15 at 09:53
  • @DivyeshJesadiya, I have amended the answer to preserve alpha channel in the watermark. As a side note, the transparency question's been answered multiple times. e.g. http://stackoverflow.com/questions/32243/can-png-image-transparency-be-preserved-when-using-phps-gdlib-imagecopyresample. – Alex Blex Nov 17 '15 at 09:13
3

You can try imagettftext method, if you don't want any such high perfection in transparency. You can have try of this code. You have to save a font file in your directory, here I used arial.ttf.

$im = imagecreatefrompng("png.png");  //create image data
$font = 'arial.ttf';  //font file name
$randomString  = "example.com";   //string need to be shown
$main_width = imagesx($im);       //finding width and height
$main_height = imagesy($im);      
$posx= $main_width/2;    //finding center 
$posy = $main_height/2;
$color = imagecolorallocate($im, 200, 200, 200);  //Creating color 
$size = ($main_width/25)+1;     //determine size of font. +1 to avoid 0
$temp = $size*5;     
$posx = $posx-$temp;    //adjust to average center
imagettftext($im,$size,0, $posx, $posy, $color, $font , $randomString);   //apply a text

You have to adjust posx and posy for your text position. Size also can be adjusted with some logics.

$color = imagecolorallocate($im, 0, 0, 0);= black

and $color = imagecolorallocate($im, 255, 255, 255); = white.

You have to adjust this for your required text color.

Subin Thomas
  • 1,408
  • 10
  • 19