Скрипт за воден знак.

gLaVoReZa

Registered
Здравейте,

трябва да направя скрипт, който да слага воден знак върху зададени изображения, като видимостта на водния знак да е примерно 50 процента. Обаче много важно нещо е, че искам водния знак да се повтаря вертикално и хоризонтално.

Примерно ако входното изображение е 1024 х 768 пиксела, а водния знак е 200 х 150 пиксела, то водният знак трябва да се повтори няколко пъти върху оригиналното изображение, а не да излезе само един път.
 
PHP:
<?php 
 
$main_img         = "YourMainPicture.jpg"; // главното изображение
$watermark_img    = "watermark.gif"; // Изображението , което се използва за воден знак . Използвайте GIF или PNG, JPEG няма подръжка на прозрачност
$padding         = 3; // разстоянието до border в пиксели за изображението на водния знак
$opacity        = 100;    // прозрачността на водния знак
 
$watermark     = imagecreatefromgif($watermark_img); // прави водния знак
$image         = imagecreatefromjpeg($main_img); // прави главното изображение
 
if(!$image || !$watermark) die("Error: main image or watermark could not be loaded!");
 
 
$watermark_size     = getimagesize($watermark_img);
$watermark_width     = $watermark_size[0]; 
$watermark_height     = $watermark_size[1]; 
 
$image_size     = getimagesize($main_img); 
$dest_x         = $image_size[0] - $watermark_width - $padding; 
$dest_y         = $image_size[1] - $watermark_height - $padding;
 
 
// копира водния знак и го поставя в главното изображение
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $opacity);
 
 
// изкарва изображението
header("content-type: image/jpeg"); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark);
?>
 
Е за какво ми е това? Първо, не работи ако водният знак е PNG. Второ, не се повтаря, както изрично съм подчертал. И трето, че ми излиза някаква рамка около водния знак.
 
gLaVoReZa, нали не очакваш някой да го направи вместо теб? Тук са се събрали хора, които си помагат, а не вършат работата на другите. chepa ти е дал пример, който много лесно можеш да промениш и да удоволетвори нуждите ти.

RE: Първо, не работи ако водният знак е PNG
Ако поразгледаш кода, watermark в примера е gif файл, затова е използвана GD функцията imagecreatefromgif, за твоя изненада - в GD има функция imagecreatefrompng - т.е., достатъчно е да промениш три букви и ще работи и с PNG файл за watermark.

RE: Второ, не се повтаря, както изрично съм подчертал.
В примерния код е показано как взимаш размерите (ширина и височина) на основната картинка и на watermark картинката. Ако изчислиш съотношението на височината на основната картинка към височаната на watermark картинката, ще получиш колко пъти watermark картинката трябва да се повтори по вертикала. По същия начин за хоризонтала. След това завърташ два цикъла и извикваш imagecopymerge колкото пъти е необходимо, като всеки път изчисляваш $dest_x, $dest_y. Използва се деление и умножение.

RE: И трето, че ми излиза някаква рамка около водния знак.
Абсолютно никъде в примерния код не е сложена рамка около водния знак. Вероятно тя е част от картинката, която използваш за воден знак.

Можеш да го редактираш за 10 минути. Имаш примера, имаш обяснението, ако имаш проблем, обясни, покажи, ще ти се помогне.
 
за твоя изненада - в GD има функция imagecreatefrompng - т.е., достатъчно е да промениш три букви и ще работи и с PNG файл за watermark.
Първо, ако обичаш не ми дръж такъв тон. Естествено, че съм заменил imagecreatefromgif, проблемът не идва от това. Проблемът е в imagecopymerge.

Второ, написах си го сам още в същия ден.

Трето, за какво ми е тоя "пример", при положение, че няма нищо общо с това, което съм написал? Аз не търся скрипт за воден знак, такива има колкото искаш. Търся специално такъв, който повтаря водния знак и това изобщо не ми върши работа.
 
Няма абсолютно никакъв проблем с imagecopymerge, а примера по-горе е на 99% това което искаш.

PHP:
<?php 
 
$main_img         = "YourMainPicture.jpg"; // главното изображение
$watermark_img    = "watermark.gif"; // Изображението , което се използва за воден знак . Използвайте GIF или PNG, JPEG няма подръжка на прозрачност
$padding         = 3; // разстоянието до border в пиксели за изображението на водния знак
$opacity        = 100;    // прозрачността на водния знак
 
$watermark     = imagecreatefromgif($watermark_img); // прави водния знак
$image         = imagecreatefromjpeg($main_img); // прави главното изображение
 
if(!$image || !$watermark) die("Error: main image or watermark could not be loaded!");
 
 
$watermark_size     = getimagesize($watermark_img);
$watermark_width     = $watermark_size[0]; 
$watermark_height     = $watermark_size[1]; 
 
$image_size     = getimagesize($main_img); 
//$dest_x         = $image_size[0] - $watermark_width - $padding; 
//$dest_y         = $image_size[1] - $watermark_height - $padding;
 
// колко пъти да се повтори по вертикала
$vertical = ceil($image_size[1]/$watermark_height);

// колко пъти да се повтори по хоризонтала
$horisontal = ceil($image_size[0]/$watermark_width);

for($v = 0; $v < $vertical; $v++){
	for($h = 0; $h < $horisontal; $h++){
		// копира водния знак и го поставя в главното изображение
		
		$dest_x = $h * $watermark_width;
		$dest_y = $v * $watermark_height;

		imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $opacity);
	}
}

 
// изкарва изображението
header("content-type: image/jpeg"); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark);
 

Back
Горе