Интересно почитать… Блог в котором есть много интересной информации…

22 ноября 2011

Как сделать Watermark на PHP

Категория: программирование — dmitriano @ 13:43

imageСтандартным методом защиты изображений на веб-сайтах является так называемый watermark. Он бывает статический и динамический. Статический это когда картинка хранится на сервере с уже добавленным watermark, динамический это когда watermark добавляется при скачивании картинки с сервера. Статический вариант рассматривать не будем, так как он обладает рядом очевидных недостатков.

Что есть в интернете на тему watermark

Ну во-первых есть некоторое количество плагинов для WordPress, потом можно найти такой скрипт:

<?php
// watermark.php

// Path the the requested file
$path = $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'];

// Load the requested image
$image = imagecreatefromstring(file_get_contents($path));

$w = imagesx($image);
$h = imagesy($image);

// Load the watermark image
$watermark = imagecreatefrompng('watermark.png');

$ww = imagesx($watermark);
$wh = imagesy($watermark);

// Merge watermark upon the original image (centred)
imagecopy($image, $watermark, (($w/2)-($ww/2)), (($h/2)-($wh/2)), 0, 0, $ww, $wh);

imagealphablending($image, false);
imagesavealpha($image, true);

// Send the image
header('Content-type: image/png');
imagepng($image);
exit();
?>

этот скрипт просто напросто добавляет watermark.png поверх исходного изображения. Скрипт рабочий, в увеличенном виде получается вот такая картинка:

goog-watermark

тут как видно прозрачность исходного изображения сохраняется.

но обладает рядом недостатков:

  1. Иногда наблюдается вот такой странный эффект, когда у изображения после масштабирования посредине возникает белый квадрат:
    watermark-strange
    это дело как-то связано с функциями imagealphablending и imagesavealpha. Возможно, есть какая специальная графическая библиотека, которая умеет работать alpha blending-ом.
  2. Он хорошо работает только для картинок с примерно одинаковым размером, так как watermark.png не масштабируется.

Какой watermark надо сделать

Нужен скрипт watermark-а, аналогичный приведенному выше, который на вход получает исходное изображение и на выходе выдаёт изображение с watermark, но без указанных недостатков. В идеале, скрипт должен дорисовывать прозрачный текст с тонкими полупрозрачными границами наискосок с левого верхнего угла в правый нижний, при этом размер шрифта должен выбираться в зависимости от размера изображения. Текст должен задаваться как параметр скрипта. В упрощенном варианте можно добавлять повторяющийся текст несколько раз, но это только в том случае если не получится реализовать первый вариант. Цвет текста и степень прозрачности должны задаваться в конфигурационном файле. Также надо задавать в конфигурационном файле отступы от края в процентах.

Примеры изображений которые должны получиться (можно увеличить кликом):

watermark-demowatermark-demo-with-bgwatermark-demo-with-bg1

все изображения в формате png. Слева прозрачное изображение с полупрозрачной тенью, тень после добавления watermark-а должна остаться прозрачной и через неё должен просвечивать фон сайта, как на правой и средней картинке. Логотип тут внутри полностью прозрачный, а прозрачность границ должна задаваться параметром скрипта, тут логотип на правой картинке более прозрачный чем на левой. Текст должен отображаться под углом 45° с учетом отступов заданных в процентах через параметры скрипта.

Вот как выглядит watermark без апельсинов:

watermark-textwatermark-text1

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

Какие PHP функции можно использовать для реализации Watermark

Нарисовать текст под углом можно с помощью стандартных PHP функций:

  • imagettfbbox – измерение текста
  • imagettftext – рисование текста под углом
  • imagecopymerge – наложение с заданной прозрачностью
  • imagecolorallocatealpha – рисование прозрачным цветом, при использовании этой функции не надо создавать дополнительное изображение

при этом эффекта тени можно добиться с помощью сдвига текста.

Линии 3D/Шарики 3D

4 комментария »

  1. я чайник. по-ходу, интересная информация, но было бы приятней, если бы при кликании на картинки они бы открывались в новом окне, а то получается, я открыл, посмотрел, закрыл и блин…. сайта нет, опять лезешь в поисковик и ищешь сайт
    2 начало хорошее, но концовка… может спец и разберется, а почему бы не написать ещё 2000 знаков для того, чтоб я мог конкретно это применить на своём сайте? Имею ввиду… объяснить как для чайников, таких как я. Ведь, спецы , думаю всё это уже давно знают…
    С уважением, Я
    пс кстати, эта «объяснялка» и рейтинг сайта повысит

    Комментарий от сла — 25 мая 2012 @ 12:14

  2. Здравсвуйте, я профи)
    чтобы картинка открывалась в новом окне можно использовать jQuery или если ваш сайт под Joomla или WordPress, например, то использовать готовый плагин, это уже к watermark не относится.

    Комментарий от admin — 25 мая 2012 @ 13:33

  3. А куда вставлять этот код?

    Комментарий от Иван — 9 июля 2012 @ 19:16

  4. если Apache под Linux то можно испльзовать mod_rewrite и добавить в .htaccess вызов этого кода для jpg и png

    Комментарий от admin — 9 июля 2012 @ 22:05

RSS feed for comments on this post. TrackBack URL

Leave a comment

SlogPost.ru