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

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

Image CMS

Oleg19

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

Oleg19

Опытный
#3

andrej

Форумчанин
#4
Я решил без плагинов. .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!
 

Вложения

Последнее редактирование:
#5
Я решил без плагинов. .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

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

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