Наложение водяного знака на картинку

379
30 августа 2017, 17:06

Понадобилось наложить водяной знак на изображение, нашел в интернете такой код:

<?php 
  function can_upload($file){ 
	// если имя пустое, значит файл не выбран 
    if($file['name'] == '') 
		return 'Вы не выбрали файл.'; 
	 
	/* если размер файла 0, значит его не пропустили настройки  
	сервера из-за того, что он слишком большой */ 
	if($file['size'] == 0) 
		return 'Файл слишком большой.'; 
	 
	// разбиваем имя файла по точке и получаем массив 
	$getMime = explode('.', $file['name']); 
	// нас интересует последний элемент массива - расширение 
	$mime = strtolower(end($getMime)); 
	// объявим массив допустимых расширений 
	$types = array('jpg', 'png', 'gif', 'bmp', 'jpeg'); 
	 
	// если расширение не входит в список допустимых - return 
	if(!in_array($mime, $types)) 
		return 'Недопустимый тип файла.'; 
	 
	return true; 
  } 
 
  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]);  
  $pos_y = ($image_info[1] - $watermark_info[1]);  
   
  // помещаем водяной знак на изображение 
  imagecopy($img, $watermark, $pos_x, $pos_y, 0, 0, $watermark_info[0],  
                    $watermark_info[1]); 
	$getMime = explode('.', $file['name']); 
	// нас интересует последний элемент массива - расширение 
	$mime = strtolower(end($getMime)); 
	$name = time().".".$mime; 
	 
	$im_save_func($img, 'img/' . $name); 
	echo $im_save_func; 
}

<?php 
  include_once('functions.php') 
?> 
<!DOCTYPE html> 
<html> 
  <head> 
    <meta charset="utf-8"> 
    <title>Загрузка изображений на сервер</title> 
  </head> 
  <body> 
    <form method="post" enctype="multipart/form-data"> 
      <input name="MAX_FILE_SIZE" value="10485760"> 
      <input type="file" name="file"> 
      <input type="submit" value="Загрузить файл!"> 
    </form> 
    <?php 
    // если была произведена отправка формы 
    if(isset($_FILES['file'])) { 
      // проверяем, можно ли загружать изображение 
      $check = can_upload($_FILES['file']); 
     
      if($check === true){ 
        // загружаем изображение на сервер 
        make_upload($_FILES['file']); 
        echo "<strong>Файл успешно загружен!</strong>"; 
      } 
      else{ 
        // выводим сообщение об ошибке 
        echo "<strong>$check</strong>";   
      } 
      	echo $im_save_func; 
    } 
    ?> 
  </body> 
</html>

Но проблема в том, что он накладывает водяной знак, когда загружаешь изображение на сервер, а что делать, если картинка уже лежит на сервере? Ознакомление с кодом показало, что во время работы многие данные код берет из $_FILE, когда картинка приходит на сервер. Поскольку изображение лежит уже на сервере, то ничего этого нет. Можете подсказать, как подредактировать код, чтобы он добавлял водяные знаки на уже загруженные изображения? Названия файлов, которые нужно отредактировать, я заранее знаю.

Answer 1

За работу с изображением отвечает функция make_upload($file), где в качестве $file всегда передается $_FILE['file']. Сама функция использует только поля $file['tmp_name'] (как путь к файлу-источнику) и $file['name'] (как путь к результирующему файлу).

Вы можете ничего не менять и просто вызывать функцию таким образом:

$cfg = array(
    'tmp_name' => 'images/input.png', // Путь к исходному изображению
    'file' => 'images/output.png'     // Путь, по которому будет сохранено изображение с водным знаком 
);
make_upload($cfg);

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

READ ALSO
No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource

No 'Access-Control-Allow-Origin' header is present on the requested resource

С одного домена/сервера на другой идет ajax запрос, выходит ошибка No 'Access-Control-Allow-Origin' header is present on the requested resourceВ

287
Поиск зависимостей в наборе числ на php

Поиск зависимостей в наборе числ на php

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

295
PHP, найти подстроку без учета пробелов

PHP, найти подстроку без учета пробелов

Здравствуйте, есть строка (она может меняться), в ней нужно найти подстроку, например XYZ, вопрос заключаетсяв том что XYZ может меняться, в том...

229