005.jpg

Наносить текстовые водяные знаки (и надписи в целом) на картинки средствами PHP мы уже умеем. Теперь рассмотрим как делать то же самое, только на этот раз вместо текста будет графический маркер. Сам маркер (т.е. наш водяной знак) должен представлять собой картинку в формате PNG-8 (глубина цвета — 8 бит), допускается прозрачность и произвольная форма. Если маркер будет с другой глубиной цвета, то при наложении прозрачный цвет будет заменен на черный. Другой формат маркеров не поддерживается! Файл PNG определяется по расширению, можно анализировать внутреннюю структуру, но это, наверное, в данном случае лишнее и остается на совести вебмастера.

//-------------------------------------------------------------------
// Функция нанесения графического водяного знака на изображение
// Copyright (C) Maksis / PCL
// http://www.maksis.ru
//-------------------------------------------------------------------
// Параметры вызова:
// $picture - путь к файлу картинки на сервере
// $marker - путь к файлу водяного знака на сервере
// $opacity - процент прозрачности
// $watermark_position - положение водяного знака на картинке
//-------------------------------------------------------------------

// Константы положения водяного знака на картинке
define ("WATERMARK_LEFT_BOTTOM",0);
define ("WATERMARK_LEFT_TOP",1);
define ("WATERMARK_RIGHT_BOTTOM",2);
define ("WATERMARK_RIGHT_TOP",3);
define ("WATERMARK_CENTER",4);

function Watermark_PNG_Image($picture, $marker, $opacity=100,
$watermark_position=WATERMARK_RIGHT_BOTTOM) {
// Проверки на наличие файлов и допустимые параметры
if (!file_exists($picture)) { return false; }
if (!file_exists($marker)) { return false; }

// Получить размеры исходного изображения
list ($sx,$sy)=GetImageSize($picture);
if ($sx==0 || $sy==0) { return false; }

// Получить размеры маркера
list ($mx,$my)=GetImageSize($marker);
if ($mx==0 || $my==0 || $sx<($mx+20) || $sy<($my+20)) { return false; }

// Если расширение маркера не .PNG, то выход с ошибкой
if (strtolower(substr($marker,-4))!=".png") { return false; }

// Если расширения нет, то выход с ошибкой
$pocket=Array();
eregi("\.([a-z]*)$",$picture,$pocket);
if ($pocket[1]=="") { return false; }

// На основании расширения создать картинку
switch (strtolower($pocket[1])) {
case "jpeg":
case "jpg": {
if (!$im=@ImageCreateFromJpeg($picture)) { return false; }
break;
}
case "gif": {
if (!$im=@ImageCreateFromGif($picture)) { return false; }
break;
}
case "png": {
if (!$im=@ImageCreateFromPng($picture)) { return false; }
break;
}
default: { return false; }
}

// Получить координаты блока на картинке для нанесения надписи
switch ($watermark_position) {
case WATERMARK_LEFT_BOTTOM: {
$pos_x=10;
$pos_y=$sy-$my-10;
break;
}
case WATERMARK_RIGHT_BOTTOM: {
$pos_x=$sx-$mx-10;
$pos_y=$sy-$my-10;
break;
}
case WATERMARK_LEFT_TOP: {
$pos_x=10;
$pos_y=10;
break;
}
case WATERMARK_RIGHT_TOP: {
$pos_x=$sx-$mx-10;
$pos_y=10;
break;
}
case WATERMARK_CENTER: {
$pos_x=intval($sx/2-$mx/2);
$pos_y=intval($sy/2-$my/2);
break;
}
default: {
imageDestroy($im);
return false;
}
}

// Нанести водяной знак с нужной прозрачностью
$watermark=@ImageCreateFromPng($marker);
ImageCopyMerge($im, $watermark, $pos_x, $pos_y, 0, 0, $mx, $my, $opacity);
ImageDestroy($watermark);

// Записать измененный файл на место
switch (strtolower($pocket[1])) {
case "jpeg":
case "jpg": {
ImageJPEG($im,$picture,90);
break;
}
case "gif": {
ImageGIF($im,$picture);
break;
}
case "png": {
ImagePNG($im,$picture);
break;
}
}
ImageDestroy($im);
return true;
}

Параметры вызова функции: $picture — полный путь к файлу на сервере, поддерживаются форматы JPG, GIF, PNG. Файл должен быть доступен для записи, так как после нанесения водяного знака он будет перезаписан с тем же именем. $marker — полный путь к файлу водяного знака в формате PNG. $opacity — прозрачность водяного знака в процентах, необязательный параметр, по умолчанию 100%. $watermark_position — положение маркера на картинке, необязательный параметр, по умолчанию правый нижний угол изображения. Доступные значения определены константами, прочие значения игнорируются: 0 — левый нижний угол, 1 — левый верхний угол, 2 — правый нижний угол (значение по умолчанию), 3 — правый верхний угол, 4 — центр изображения.

006.jpg

В этом примере графический логотип с разной степенью прозрачности наложен на все пять доступных областей рисунка. Функция, соответственно, вызывалась пять раз.

h++p://www.manhunter.ru/webmaster/153_nanesenie_graficheskih_vodyanih_znakov_na_izobrazhenie.html

Категория: PHP, HTML, CSS...

Оставьте свой комментарий