3 способа добавить watermark (водяной знак) на изображение — php

Немного порылся в своих старых проектах, нашел целых три способа, как я в свое время реализовывал добавление водяного знака на картинки.

Первое, что хотелось бы сказать: сохраняйте классы и функции, велосипед — это клево, но несколько раз — слишком (в моем случае дело упрощает то, что один из них — трехколесный, еще один — чужой).

Второе: опишу по-подробнее, что да как:

Исходные данные:

замечательный рисунок работы Вила Мюрэя:

прозрачный png8:

прозрачный png24:

И какой-нибудь файл шрифта ttf.

Способ №1

Вывод по диагонали строки на изображение.


class watermark1
{
  function create_watermark( $main_img_obj, $text, $font, $r = 128, $g = 128, $b = 128, $alpha_level = 100 )
  {
   $width = imagesx($main_img_obj);
   $height = imagesy($main_img_obj);
   $angle =  -rad2deg(atan2((-$height),($width)));

   $text = " ".$text." ";

   $c = imagecolorallocatealpha($main_img_obj, $r, $g, $b, $alpha_level);
   $size = (($width+$height)/2)*2/strlen($text);
   $box  = imagettfbbox ( $size, $angle, $font, $text );
   $x = $width/2 - abs($box[4] - $box[0])/2;
   $y = $height/2 + abs($box[5] - $box[1])/2;

   imagettftext($main_img_obj,$size ,$angle, $x, $y, $c, $font, $text);
   return $main_img_obj;
  }
}

$main_img_obj — идентификатор изображения, на которое добавляется надпись

$text — текст надписи

$font — имя файла шрифта .ttf

$r,$g,$b — цвет надписи

$alpha_level — прозрачность (0 — не прозрачная, 128 — полностью прозрачная)

Вызываем:

$watermark = new watermark1();
$img = imagecreatefromjpeg(«image.jpg»);
$im=$watermark->create_watermark($img,»jeka911.wordpress.com»,»1.ttf»,0,0,255,120);
imagejpeg($im,»result.jpg»);

Получаем:

Все просчеты в функции получены методом тыка, так что не бойтесь экспериментировать.

Способ №2

Добавление в качестве вотермарка 8-битного png


class watermark2
{
function create_watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100 )
{
$watermark_width = imagesx($watermark_img_obj);
$watermark_height = imagesy($watermark_img_obj);

$dest_x = imagesx($main_img_obj) - $watermark_width - 5;
$dest_y = imagesy($main_img_obj) - $watermark_height - 5;
imagecopymerge($main_img_obj, $watermark_img_obj, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $alpha_level);

return $main_img_obj;
}
}

$main_img_obj — идентификатор изображения, на которое добавляется надпись

$watermark_img_obj — ид. изображения прозрачного png8

$alpha_level — прозрачность (0 — прозрачное, 100 — полностью непрозрачное)

Вызываем:

$watermark = new watermark2();
$img = imagecreatefromjpeg(«image.jpg»);
$water = imagecreatefrompng(«watermark8.png»);
$im=$watermark->create_watermark($img,$water,10);
imagejpeg($im,»result.jpg»);

Получаем:

Способ №3

Добавление водяным знаком 24х битного png (видимо, брал отсюда)


class watermark3{

	# given two images, return a blended watermarked image
	function create_watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100 ) {
		$alpha_level	/= 100;	# convert 0-100 (%) alpha to decimal

		# calculate our images dimensions
		$main_img_obj_w	= imagesx( $main_img_obj );
		$main_img_obj_h	= imagesy( $main_img_obj );
		$watermark_img_obj_w	= imagesx( $watermark_img_obj );
		$watermark_img_obj_h	= imagesy( $watermark_img_obj );

		# determine center position coordinates
		$main_img_obj_min_x	= floor( ( $main_img_obj_w / 2 ) - ( $watermark_img_obj_w / 2 ) );
		$main_img_obj_max_x	= ceil( ( $main_img_obj_w / 2 ) + ( $watermark_img_obj_w / 2 ) );
		$main_img_obj_min_y	= floor( ( $main_img_obj_h / 2 ) - ( $watermark_img_obj_h / 2 ) );
		$main_img_obj_max_y	= ceil( ( $main_img_obj_h / 2 ) + ( $watermark_img_obj_h / 2 ) ); 

		# create new image to hold merged changes
		$return_img	= imagecreatetruecolor( $main_img_obj_w, $main_img_obj_h );

		# walk through main image
		for( $y = 0; $y < $main_img_obj_h; $y++ ) {
			for( $x = 0; $x < $main_img_obj_w; $x++ ) {
				$return_color	= NULL;

				# determine the correct pixel location within our watermark
				$watermark_x	= $x - $main_img_obj_min_x;
				$watermark_y	= $y - $main_img_obj_min_y;

				# fetch color information for both of our images
				$main_rgb = imagecolorsforindex( $main_img_obj, imagecolorat( $main_img_obj, $x, $y ) );

				# if our watermark has a non-transparent value at this pixel intersection
				# and we're still within the bounds of the watermark image
				if (	$watermark_x >= 0 && $watermark_x < $watermark_img_obj_w &&
							$watermark_y >= 0 && $watermark_y < $watermark_img_obj_h ) {
					$watermark_rbg = imagecolorsforindex( $watermark_img_obj, imagecolorat( $watermark_img_obj, $watermark_x, $watermark_y ) );

					# using image alpha, and user specified alpha, calculate average
					$watermark_alpha	= round( ( ( 127 - $watermark_rbg['alpha'] ) / 127 ), 2 );
					$watermark_alpha	= $watermark_alpha * $alpha_level;

					# calculate the color 'average' between the two - taking into account the specified alpha level
					$avg_red		= $this->_get_ave_color( $main_rgb['red'],		$watermark_rbg['red'],		$watermark_alpha );
					$avg_green	= $this->_get_ave_color( $main_rgb['green'],	$watermark_rbg['green'],	$watermark_alpha );
					$avg_blue		= $this->_get_ave_color( $main_rgb['blue'],	$watermark_rbg['blue'],		$watermark_alpha );

					# calculate a color index value using the average RGB values we've determined
					$return_color	= $this->_get_image_color( $return_img, $avg_red, $avg_green, $avg_blue );

				# if we're not dealing with an average color here, then let's just copy over the main color
				} else {
					$return_color	= imagecolorat( $main_img_obj, $x, $y );

				} # END if watermark

				# draw the appropriate color onto the return image
				imagesetpixel( $return_img, $x, $y, $return_color );

			} # END for each X pixel
		} # END for each Y pixel

		# return the resulting, watermarked image for display
		return $return_img;

	} # END create_watermark()

	# average two colors given an alpha
	function _get_ave_color( $color_a, $color_b, $alpha_level ) {
		return round( ( ( $color_a * ( 1 - $alpha_level ) ) + ( $color_b	* $alpha_level ) ) );
	} # END _get_ave_color()

	# return closest pallette-color match for RGB values
	function _get_image_color($im, $r, $g, $b) {
		$c=imagecolorexact($im, $r, $g, $b);
		if ($c!=-1) return $c;
		$c=imagecolorallocate($im, $r, $g, $b);
		if ($c!=-1) return $c;
		return imagecolorclosest($im, $r, $g, $b);
	} # EBD _get_image_color()

} # END watermark API

$main_img_obj — идентификатор изображения, на которое добавляется надпись

$watermark_img_obj — ид. изображения прозрачного png8

$alpha_level — прозрачность (0 — прозрачное, 100 — полностью непрозрачное)

Вызываем:

$watermark = new watermark3();
$img = imagecreatefromjpeg(«image.jpg»);
$water = imagecreatefrompng(«watermark24.png»);
$im=$watermark->create_watermark($img,$water,10);
imagejpeg($im,»result.jpg»);

Получаем:

Спасибо за внимание.

RSS

Реклама

18 Responses to 3 способа добавить watermark (водяной знак) на изображение — php

  1. Какой полезный пост :) Спасибо! Как раз может пригодиться скоро.

    А кстати, плагин для отображения кода — встроен в вордпресс.ком? Не знал…

  2. )) Спасибо, всегда пожалуйста ))

    Да, Мэтт писал недавно:
    http://wordpress.com/blog/2007/09/03/posting-source-code/
    Все равно глючненько немного, но хоть так.

  3. i0nn:

    Два класса подряд с одной функцией =/ Работа с пространством имен не отлажена в php5, в php 6 нормальная поддержка будет… к чему писать классы, ради одной функции?
    А так ничего, рабочий код.

  4. :) Вписывал в классы ради одного вида с 3м, а так, конечно понту нет.

  5. nopox:

    Про картинки ничего говорить не будут, всё красиво. Разве только я бы в классы не совсем так всё завернул :).

    Можно в качестве оффтопика задать вопрос г-ну i0nn? :)

    А если в классе всего одна «функция» (хотя их принято называть методами), то класс не имеет право на жизнь? :)

    P.S. И как форматировать код? :)

  6. Да, к выбору картинки я подошел с душой ))

  7. nopox:

    А как код форматировать? :)

  8. Ой.

    http://wordpress.com/blog/2007/09/03/posting-source-code/
    http://faq.wordpress.com/2007/09/03/how-do-i-post-source-code/

    Но только все равно приловчиться надо, <, & менять на коды и, вроде, если сохранять из вкладки «Code» в wysiwyg, то меньше боков.

  9. nopox:

    Преогромное мерси =)

  10. Лишь бы на здоровье =)

  11. Использование ImageMagic не проще будет?

  12. Может и проще, однако оно не везде стоит

  13. Hello Dear, I can’t read your blog. But, i have an great interest to read your blog and love it. But, how I can able to read? I can’t convert it to english? Is this possible?

    Please mail me or leave a msg on my website i would to see you once again..

    thanks

  14. […] Добавить на картинки watermark (водяные знаки, копирайты). […]

  15. […] Можно также сделать это без использования функционала системы, с использованием специальных скриптов. Несколько методов реализации данной задачи можно найти вот в этой статье https://jeka911.wordpress.com/2007/09/25/3_ways_to_add_watermark_to_image_in_php/. […]

  16. А imagedestroy кто использовать будет? ;)
    а вообще спасибо ;)

  17. Ihor Polyakov, :) не за что :)

  18. There is no query that erudition design products akin ebooks testament abide to be some of the calescent sellers over the Earth Broad Web. Citizens will surely carry forward to surf looking for news approximately every topic that you can maybe imagine.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: