• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Решено Водяные знаки

Oleg19

Опытный
Скажите как реализовать водяные знаки на уже имеющие фотографии. Установил signature watermark, но он добавляет только на новые фотографии знаки, на старые никак нельзя
Что делать?
 

Oleg19

Опытный

andrej

Форумчанин
Я решил без плагинов. .htaccess и PHP скрипт
В папку /wp-content/uploads/ кладем файл .htaccess

Perl:
# DirectoryIndex index.php
Options -Indexes

<FilesMatch "\.(jpg|JPG)$">
# <FilesMatch "\.(\/wp-admin\/).*$">
   RewriteEngine On
#   RewriteCond %{REQUEST_URI} !^/wp-admin/(.*)$
   RewriteCond %{REQUEST_FILENAME} -f
#   RewriteRule ^(.*)$ /watermark.php [T=application/x-httpd-php,L,QSA]

RewriteRule ^(.*)wp-content/uploads/(.*(jpg|JPG))$ /watermark-im2.php?img=wp-content/uploads/$2
</FilesMatch>
в корень ложим файл watermark-im2.php и файл с картинкой, в моем случае terraturista_logo-2-water.png
Ее нужно заменить на Вашу.


PHP:
<?php

// ватермарк для http://terraturista.com

$img= $_GET['img'];
$image = new Imagick();
$image->readImage($img);
// $image->blurImage( 20, 10 );


$watermark = new Imagick();
// $watermark->readImage("watermark.png");
$watermark->readImage("terraturista_logo-2-water.png");


// how big are the images?
$iWidth = $image->getImageWidth(); $iHeight = $image->getImageHeight();
// elseif (($iHeight > 381 && $iHeight < 600) || ($iWidth  > 381 && $iWidth < 749)) { $watermark->scaleImage($wWidth /2, $wHeight /2);}
// elseif (($iHeight > 601 && $iHeight < 1055) || ($iWidth  > 750 && $iWidth < 1055)) { $watermark->scaleImage($wWidth /1.5 , $wHeight /1.5 );}
// elseif (($iHeight > 1056 && $iHeight < 1401) || ($iWidth  > 1056 && $iWidth < 1401)) { $watermark->scaleImage($wWidth , $wHeight  );}


// Переключаем размер ватермарка в зависимости от ширины и высоты фотографии
if ($iHeight > 380 || $iWidth > 380) {
$wWidth = $watermark->getImageWidth(); $wHeight = $watermark->getImageHeight();
// if ($iHeight < 380 || $iWidth < 380) { $watermark->scaleImage($wWidth /4, $wHeight /4);}
if ($iHeight > 381 && $iHeight < 600) { $watermark->resizeImage($wWidth *0.6, $wHeight *0.6,  0, 1);  $watermark->unsharpMaskImage(0, 0.5, 1, 0);}
elseif ($iHeight > 601 && $iHeight < 1250)  { $watermark->resizeImage($wWidth, $wHeight, 0, 1); }
else {$watermark->scaleImage($wWidth, $wHeight);}
//  $watermark->setImageOpacity( 0.4 );

// get new size
$wWidth = $watermark->getImageWidth();
$wHeight = $watermark->getImageHeight();

// calculate the position
$x = ($iWidth - $wWidth) /1.04 ; // отступ с права
$y = ($iHeight - $wHeight) /1.02; // отступ с низу

$image->compositeImage($watermark, imagick::COMPOSITE_OVER, $x, $y);
//       $image->setImageCompression(Imagick::COMPRESSION_JPEG);
//       $image->setImageCompressionQuality(100);
//  $image->borderImage(new ImagickPixel("green"), 5, 5); // создание рамки во круг картинки
// $image->sharpenimage('1', '1'); // ($radius, $sigma, $channel)
}

header("Content-Type: image/" . $image->getImageFormat());
echo $image;

Я здесь сделал интересную фишку - Переключение размера ватермарка в зависимости от ширины и высоты фотографии
Иначе на вертикальных и горизонтальных фото будет по разному смотреться. Я под себя делал, можете с размерами сами поиграться

посмотреть как работает можно на http://terraturista.com/

Да! Для работы кода требуется Image Magick!
 

Вложения

Последнее редактирование:
Я решил без плагинов. .htaccess и PHP скрипт
В папку /wp-content/uploads/ кладем файл .htaccess

Perl:
# DirectoryIndex index.php
Options -Indexes

<FilesMatch "\.(jpg|JPG)$">
# <FilesMatch "\.(\/wp-admin\/).*$">
   RewriteEngine On
#   RewriteCond %{REQUEST_URI} !^/wp-admin/(.*)$
   RewriteCond %{REQUEST_FILENAME} -f
#   RewriteRule ^(.*)$ /watermark.php [T=application/x-httpd-php,L,QSA]

RewriteRule ^(.*)wp-content/uploads/(.*(jpg|JPG))$ /watermark-im2.php?img=wp-content/uploads/$2
</FilesMatch>
в корень ложим файл watermark-im2.php и файл с картинкой, в моем случае terraturista_logo-2-water.png
Ее нужно заменить на Вашу.


PHP:
<?php

// ватермарк для http://terraturista.com

$img= $_GET['img'];
$image = new Imagick();
$image->readImage($img);
// $image->blurImage( 20, 10 );


$watermark = new Imagick();
// $watermark->readImage("watermark.png");
$watermark->readImage("terraturista_logo-2-water.png");


// how big are the images?
$iWidth = $image->getImageWidth(); $iHeight = $image->getImageHeight();
// elseif (($iHeight > 381 && $iHeight < 600) || ($iWidth  > 381 && $iWidth < 749)) { $watermark->scaleImage($wWidth /2, $wHeight /2);}
// elseif (($iHeight > 601 && $iHeight < 1055) || ($iWidth  > 750 && $iWidth < 1055)) { $watermark->scaleImage($wWidth /1.5 , $wHeight /1.5 );}
// elseif (($iHeight > 1056 && $iHeight < 1401) || ($iWidth  > 1056 && $iWidth < 1401)) { $watermark->scaleImage($wWidth , $wHeight  );}


// Переключаем размер ватермарка в зависимости от ширины и высоты фотографии
if ($iHeight > 380 || $iWidth > 380) {
$wWidth = $watermark->getImageWidth(); $wHeight = $watermark->getImageHeight();
// if ($iHeight < 380 || $iWidth < 380) { $watermark->scaleImage($wWidth /4, $wHeight /4);}
if ($iHeight > 381 && $iHeight < 600) { $watermark->resizeImage($wWidth *0.6, $wHeight *0.6,  0, 1);  $watermark->unsharpMaskImage(0, 0.5, 1, 0);}
elseif ($iHeight > 601 && $iHeight < 1250)  { $watermark->resizeImage($wWidth, $wHeight, 0, 1); }
else {$watermark->scaleImage($wWidth, $wHeight);}
//  $watermark->setImageOpacity( 0.4 );

// get new size
$wWidth = $watermark->getImageWidth();
$wHeight = $watermark->getImageHeight();

// calculate the position
$x = ($iWidth - $wWidth) /1.04 ; // отступ с права
$y = ($iHeight - $wHeight) /1.02; // отступ с низу

$image->compositeImage($watermark, imagick::COMPOSITE_OVER, $x, $y);
//       $image->setImageCompression(Imagick::COMPRESSION_JPEG);
//       $image->setImageCompressionQuality(100);
//  $image->borderImage(new ImagickPixel("green"), 5, 5); // создание рамки во круг картинки
// $image->sharpenimage('1', '1'); // ($radius, $sigma, $channel)
}

header("Content-Type: image/" . $image->getImageFormat());
echo $image;

Я здесь сделал интересную фишку - Переключение размера ватермарка в зависимости от ширины и высоты фотографии
Иначе на вертикальных и горизонтальных фото будет по разному смотреться. Я под себя делал, можете с размерами сами поиграться

посмотреть как работает можно на http://terraturista.com/

Да! Для работы кода требуется Image Magick!
А это только при загрузке новых фото работает?
 

andrej

Форумчанин
А это только при загрузке новых фото работает?
Нет! Этот скрипт лепит ватермарк к фотке на лету! Сами фото остаются без ватермарка. То есть, если их скачаете по ФТП, ватермарка не будет. А на сайте он есть.
Волшебство ;)

Но поскольку волшебство происходит на лету, то это дает небольшую нагрузку на сервер.
Я видел подобные скрипты на чистом ФТП, вот те реально жрали ресурсы. Этот работает с Image Magick поэтому намного поменьше
 
Сверху Снизу