Watermark (водяные знаки) на изображении в WordPress
Доброго времени, читатели www.k-max.name! Сегодня опишу маленькое HOWTO, как на WordPress реализовать водяные знаки на изображениях с помощью php и apache (.htaccess). Самое интересное, что не понадобится нам никаких плагинов! При этом, данное решение вполне применимо к другим движкам. Итак, во первых, добавим в файл .htaccess следующие строки:
# enable watermark RewriteRule ^(.*)wp-content/uploads/(.*(jpg|jpeg|gif|png))$ $1watermark.php?img=wp-content/uploads/$2
Согласно данного правила, все пути, начинающиеся на wp-content/uploads/ и заканчивающиеся на jpg, jpeg, gif или png будут заменены строкой watermark.php?src=wp-content/uploads/… Это позволяет оставлять неизменными исходные изображения и не применять обработчик для таких файлов, как архивы и др. Соответственно, заменив путь wp-content/uploads/на свой можно применить обработку изображений для другого движка.
Кроме этого, необходимо положить в корень сайта файл с именем watermark.png. Это файл самого водяного знака, который будет наложен на основное изображение. Так же, необходимо положить файл empty.png, который содержит 1 прозрачный пиксель и накладывается на маленькие изображения.
Далее, необходимо создать файл watermark.php со следующим содержимым и также положить его в корень сайта:
<?php /* * Блог любителя экспериментов * https://www.k-max.name/ */ // получаем переданный в GET параметр img $img= $_GET['img']; // задаем минимальное разрешение, для которого не нужен большой водяной знак // и на основании размера применяем соответствующий png-файл $size = getimagesize($img); if ($size[0]<100 || $size[1]<100 ) { $watermark = imagecreatefrompng('empty.png'); } else { $watermark = imagecreatefrompng('watermark.png'); } $watermark_w = imagesx($watermark); $watermark_h = imagesy($watermark); // обрабатываем gif if(eregi('.gif',$img)) { $image = imagecreatefromgif($img); $size = getimagesize($img); $dest_x = $size[0] - $watermark_w - 0; $dest_y = $size[1] - $watermark_h - 0; imagealphablending($watermark, true); header('Content-type: mage/gif'); imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h, 50); imagegif($image, "", 100); } // обрабатываем jpeg elseif(eregi('.jpeg',$img)||eregi('.jpg',$img)) { $image = imagecreatefromjpeg($img); $size = getimagesize($img); $dest_x = $size[0] - $watermark_w - 0; $dest_y = $size[1] - $watermark_h - 0; imagealphablending($watermark, true); header('content-type: image/jpeg'); imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h); imagejpeg($image,"", 100); } // обрабатываем png elseif(eregi('.png',$img)) { $image = imagecreatefrompng($img); $size = getimagesize($img); $dest_x = $size[0] - $watermark_w - 0; $dest_y = $size[1] - $watermark_h - 0; imagesavealpha($image, true); imagealphablending($watermark, true); header('Content-type: image/png'); imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_w, $watermark_h); imagepng($image); } else { exit("Изображение не имеет формат jpg, gif или png."); } // освобождаем память imagedestroy($image); imagedestroy($watermark); ?>
Готовый архив можно скачать ниже и распаковать себе в корневой каталог блога. В архиве отсутствует файл .htaccess, чтобы вы не заменили свои настройки wordpress, поэтому не забудьте добавить вышеуказанную строку.
Известные баги:
- на изображениях gif – не сохраняется прозрачность водяного знака Чтобы от этого избавиться, уберите из строки в .htaccess это “|gif“. Но в таком случае, водяные знаки не будут ставится на gif изображения.
- на png с 8-bit политрой так же не сохраняется прозрачность водяного знака
- данный способ не работает на хостингах, использующих NGINX для вывода статики.
Буду благодарен за решение или подсказку решения данных проблем.
Скачать watermark для изображений WordPress.
С Уважением, Mc.Sim!
Даже на маленькие картинки все равно накладывает водяной знак.. на png
Доброго времени.
А что у вас в этиз строчках указано?
$size = getimagesize($img);
if ($size[0]<100 || $size[1]<100 ) {
$watermark = imagecreatefrompng('empty.png');
} else {
$watermark = imagecreatefrompng('watermark.png');
}
Работает. А почему не предусмотрено наложение водяного знака на bmp файлы?
честно говоря, пока еще не встречал кого-то, кто в Веб размещает bmp-формат.
Если все же есть необходимость, могу попробовать допилить статью.
Суть понял, но все равно, заразка не кидает вотермарк((
Хотя у меня не cms-ка стоит, а тупо хтмл)
буду разбираться, хотя пути к фоткам указал правильно
кенкс)
Не работает, код выдает кучу ошибок если напрямую файл кормить даже.
вордпресс 3.4.1 php 5.3
Что за ошибки?
Подскажите, пожалуйста, если напрямую вызвать картинку через watermark.php?img=…, то все прекрасно работает, но на
RewriteRule ^(.*)wp-content/uploads/(.*(jpg|jpeg|gif|png))$ $1watermark.php?img=wp-content/uploads/$2
вообще не реагирует, все картинки на сайте остались чистыми и watermark.php ни разу не вызвался.
Может у вас стоит какой-то кэширующий плагин?
Здравствуйте, спасибо вам за скрипт!
У меня аналогичная проблема, как у Korvin.
Даже обратился в тех.поддержку хостинга, они вроде помогли, включили какие-то функции, но просматривая сайт через Opera, водяной знак при увеличении фотографий по-прежнему не отображается. Хотя первое время на сайте всё отлично отображалось! Но вот на днях обнаружил отсутствие ватермарков.
Насчёт кэш плагина есть вкрапление advanced-cache, но оно неактивно.
Думаю, что тут без логов сервера не обойтись…
Кстати, здравствуйте )
Спасибо за код!)
Mc.Sim, скрипт работает, большое спасибо, давно искал нечто подобное! Добро пожаловать ко мне в блог!
Было бы не плохо, чтоб ещё делался ресайз водяного знака, в зависимости от размера изображения, на которое он накладывается.
Согласен. Было бы неплохо )
Но на это моих базовых знаний не достаточно…
Этот метод нерабочий для хостингов на которых используется связка nginx+apache, так как там статика отдается nginx-ом.
Увы, надо как-то по другому, пока выход только в плагинах, но мне лично не нравится идея вживлять водяной знак в саму картинку.
Да , согласен. Если через nginx отдавать статику, то такая схема работать скорее всего не будет. Честно говоря, не приходилось использовать для wordpress такую связку…
Большой плюс данного костыля в том, что загружаемые на хостинг картинки не модифицируются. Это для меня было определяющим параметром.
Кстати давно пользую этот код. Только удалось доработать для разных размеров изображений- разный размер знака. Плюс ещё положение водяного знака тоже можно отрегулировать. Но вот то что на некоторых хостингах не работает – пичаль-пичаль
ДА, видел Вашу модификацию. Спасибо.
А можно код для разных размеров изображений – разный размер знака?
Евгений доработал данный код и разместил на своем сайте http://z-force.info/wordpress/rabochij-sposob-dobavleniya-vodyanyx-znakov-na-blog-wordpress/
Но я не проверял данный код.
Не работает в блоге http://fotologi.ru
Без логов веб-сервера трудно что-либо подсказать…
Вот как обидно, сейчас и в старом блоге перестали накладываться водяные знаки, не отследил когда это возникло. Возможно после обновления WP. Ошибок в логах нет.
Возможно, что на хостинге применили связку nginx+apache, в этом случае работать не будет.
не согласен. На моем хостинге используется nginx+apache. И, как видите, работает.
Слушай, спасибо тебе. Решение обалденное. Терпеть не могу нагружать работу движка всякими плагинами, так что твой вариант полностью меня удовлетворяет и решает поставленную задачу.