This is a continuous tutorial to my earlier tutorial about How to add watermark to all images in a folder. In this tutorial, you will learn how to add watermark to all images in a folder and all its sub folders.
Here is the sample code:
<?php
//Source folder where all images are placed
$source="source";
//Destination folder where all images with watermark will be copied
$destination="destination";
//Creating an image object of watermark image
$watermark=imagecreatefrompng("watermark.png");
//Margin of watermark from right and bottom of the main image
$margin_right=10;
$margin_bottom=10;
//Height ($sy) and Width ($sx) of watermark image
$sx=imagesx($watermark);
$sy=imagesy($watermark);
//recursive function to get the structure of the source directory
function dirToArray($dir) {
$result = array();
$cdir = scandir($dir);
foreach ($cdir as $key => $value)
{
if (!in_array($value,array(".","..")))
{
if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
{
$result[$value] = dirToArray($dir . DIRECTORY_SEPARATOR . $value);
}
else
{
$result[] = $value;
}
}
}
return $result;
}
$structure=dirToArray($source);
$images=array();
//recursive function to find list of all files in the source directory
function fileFinder($structure,$path){
$result="";
global $images;
foreach($structure as $key=>$value){
if(is_array($value))
fileFinder($value,$path.'/'.$key);
else
$images[]=$path.'/'.$value;
}
}
fileFinder($structure,"");
foreach($images as $image){
// find the list directories to be created in the destination directory
$parts=explode("/",$image);
$parts2=array_pop($parts);
$parts3=array_shift($parts);
$directories=implode("/",$parts);
createPath($destination.'/'.$directories);
//Create image object of main image
$img=imagecreatefromjpeg($source.$image);
//Copying watermark image into the main image
imagecopy($img, $watermark, imagesx($img) - $sx - $margin_right, imagesy($img) - $sy - $margin_bottom, 0, 0, $sx, $sy);
//Saving the merged image into the destination folder
imagejpeg($img, $destination.'/'.$image,100);
//Destroying the main image object
imagedestroy($img);
}
function createPath($path) {
if (is_dir($path)) return true;
$prev_path = substr($path, 0, strrpos($path, '/', -2) + 1 );
$return = createPath($prev_path);
return ($return && is_writable($prev_path)) ? mkdir($path) : false;
}
//Destroying watermark image object
imagedestroy($watermark);