Задача:

  • Картинки находятся в папке img в корне сайта;
  • Добавить на картинки водяной знак по центру;
  • Перенести все картинки в папку cache;

Решение:

ini_set('memory_limit', '-1');
ignore_user_abort();
set_time_limit(0);

$path = $_SERVER['DOCUMENT_ROOT'];
$root = $path."/img";
$logo = imagecreatefrompng('logo.png');
$sx   = imagesx($logo);
$sy   = imagesy($logo);

function replace($dir) {
	global $logo;
	global $sx;
	global $sy;
	
	$new_dir = null;
	$dir_files = opendir($dir);
	
	while(false !== ($file = readdir($dir_files))) {
		if($file != '.' && $file != '..') {
			$new_dir[] = $dir."/".$file;
		}
	}
	
	if($new_dir) {
		foreach($new_dir as $check) {
			if(is_file($check)) {
				$w = '';
				$h = '';
				$k = '';
				$s = '';
				
				$im = imagecreatefromjpeg($check);
				$w = imagesx($im) - 20;
				$k = $sx/$w;
				$h = ceil($sy/$k);
				
				$s = imagecreatetruecolor($w, $h);
				$transparent = imagecolorallocatealpha($s, 0, 0, 0, 127);
				
				imagefill($s, 0, 0, $transparent);
				imagesavealpha($s, true);
				imagecopyresampled($s, $logo, 0, 0, 0, 0, $w, $h, $sx, $sy);
				
				$cn = ceil((imagesy($im) - $h) / 2);
				imagecopy($im, $s, imagesx($im) - $w - 10,  $cn, 0, 0, imagesx($s), imagesy($s));
				
				$fileName = basename($check);
				$put = substr($check, 0, -strlen($fileName));
				$put = str_replace("img", "cache", $put);
				
				if (!file_exists($put)) {
					mkdir($put, 0777, true);
				}
				
				$new = str_replace("img", "cache", $check);
				
				imagejpeg($im, $new, 100); 
				imagedestroy($im);
			} elseif(is_dir($check)) {
				replace($check);
			}
		}
	}
}

replace($root);