PHP. Наложение водяного знака.

PHP. Наложение водяного знака.

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

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

  1. «Что необходимо учитывать при загрузке файлов на сервер»
  2. «Загрузка изображений на сервер»

За основу возьмём код, написанный в вышеуказанных статьях, и добавим в него необходимые элементы.

Стандартные функции

Для начала небольшая справка по тем стандартным функциям PHP, которые нам с вами придётся использовать:

  1. getimagesize – возвращает полезные данные об изображении. Нас будут интересовать ширина, высота и MIME-тип картинки.
  2. imagecreatefrom*** - одна из функций imagecreatefromjpeg, imagecreatefrompng и т.д. Вместо звёздочек мы будет подставлять MIME-тип загружаемого изображения. Результатом работы функции является представление картинки в памяти PHP.
  3. image*** - одна из функций imagejpeg, imagepng и т.д. Результатом работы функции является сохранённое изображение.
  4. imagecopy – функция для копирования изображения. Её мы будем использовать непосредственно для наложения одной картинки на другую.

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

Наложение знака при загрузке - функция

Итак, вот во что превратится наша функция make_upload:

function make_upload($file){
  // получаем полезные данные о картинке и водяном знаке
  $image_info = getimagesize($file['tmp_name']);
  $watermark_info = getimagesize('watermark.png');
  
  // определяем MIME-тип изображения, для выбора соответствующей функции
  $format = strtolower(substr($image_info['mime'], 
                                   strpos($image_info['mime'], '/') + 1));
  
  // определяем названия функция для создания и сохранения картинки
  $im_cr_func = "imagecreatefrom" . $format;
  $im_save_func = "image" . $format;
  
  // загружаем изображение в php
  $img = $im_cr_func($file['tmp_name']);
  
  // загружаем в php наш водяной знак
  $watermark = imagecreatefrompng('watermark.png');
  
  // определяем координаты левого верхнего угла водяного знака
  $pos_x = ($image_info[0] - $watermark_info[0]) / 2; 
  $pos_y = ($image_info[1] - $watermark_info[1]) / 2; 
  
  // помещаем водяной знак на изображение
  imagecopy($img, $watermark, $pos_x, $pos_y, 0, 0, $watermark_info[0], 
                    $watermark_info[1]);
  
  // сохраняем изображение с уникальным именем
  $name = mt_rand(0, 10000) . $file['name'];
  $im_save_func($img, 'img/' . $name);
}

Первый момент, который может вызвать определённое непонимание, – это непривычная запись $im_cr_func($file['tmp_name']). Что же это такое? На самом деле вместо $im_cr_func будет подставлено название функции, которую мы выбрали. Например, при загрузки jpg-картинки будет вызвана функция imagecreatefromjpeg.

После выполнения данного действия в переменной $img у нас хранится представление картинки в памяти PHP. Аналогичным образом заносим в переменную $watermark изображение водяного знака. Обратите внимание, что эта картинка лежит у нас в корне сайта.

Следующий важный шаг – расчёт правильных координат для наложения изображений. Тут схема классическая: половина разности ширин – это отступ слева, половина разности высот – отступ сверху. После этого с помощью функции imagecopy мы совмещаем оба изображения.

Ну, фактически всё! Теперь просто вызываем $im_save_func, куда передаём ссылку на совмещённое изображение и путь, по которому картинку нужно сохранить.

Вот такая система!

В итоге мы научились накладывать водяной знак на загружаемое изображение, а вскоре разберём изменение размера загружаемого изображения. Не пропустите!