Перейти к контенту

Вариация Watermark'а для IPB


Рекомендуемые сообщения

В общем, вроде есть какие-то модификации с ватермарком, но они не устраивают хотя бы тем, что меняют файл на лету, а данная штука, по идее, только выдает пользователю измененную картинку, сами же файлы сервера остаются без изменений.

Главные плюсы задумки это:

1) Универсальность

2) Широкие возможности

3) Сохранение оригинала

4) Изменение "на лету"(т.е. не требуется обработка имеющихся до установки модификации картинок)

5) Ну ОЧЕНЬ простая установка и схема работы!

 

Итак, выглядит это следующим образом:

1) В корне форума папка watermark в ней два файла _watermark.php(собсно, скрипт) и _watermarkmini.png(логотип, который будет "разводить" и наклеивать на картинку).

2) В uploads .htaccess содержит следующие директивы:

Options +Indexes
DirectoryIndex index.htm

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

Проще говоря, если расширение файла из аплоадсов совпадает с вышеуказанными, то он заменяется на скрипт. Вот, собсно, содержимое скрипта(с рекламой, т.к. скрипт придумал не я, оставляю авторскую подпись, так сказать):

<?
/*******************************************
* WWW.AGAKIDS.RU- поисковая система детских сайтов
* watermark 0.1
********************************************/

waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "_watermarkmini.png", "bottom=5,right=5");

function waterMark($original, $watermark, $placement = 'bottom=5,right=5', $destination = null) {
$info_o = @getImageSize($original);
if (!$info_o)
		return false;
$info_w = @getImageSize($watermark);
if (!$info_w)
		return false;

list ($vertical, $horizontal) = split(',', $placement,2);
list($vertical, $sy) = split('=', trim($vertical),2);
list($horizontal, $sx) = split('=', trim($horizontal),2);

switch (trim($vertical)) {
	case 'bottom':
		$y = $info_o[1] - $info_w[1] - (int)$sy;
		break;
	case 'middle':
		$y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy;
		break;
	default:
		$y = (int)$sy;
		break;
	}

switch (trim($horizontal)) {
	case 'right':
		$x = $info_o[0] - $info_w[0] - (int)$sx;
		break;
	case 'center':
		$x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx;
		break;
	default:
		$x = (int)$sx;
		break;
	}

header("Content-Type: ".$info_o['mime']);

$original = @imageCreateFromString(file_get_contents($original));
$watermark = @imageCreateFromString(file_get_contents($watermark));
$out = imageCreateTrueColor($info_o[0],$info_o[1]); 

imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]); 
imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]);

switch ($info_o[2]) {
	case 1:
		imageGIF($out);
		break;
	case 2:
		imageJPEG($out);
		break;
	case 3:
		imagePNG($out);
		break;
		}

imageDestroy($out);
imageDestroy($original);
imageDestroy($watermark);

return true;
}

?>

 

 

В общем, всё вроде замечательно, только проблема в том, что не пашет это дело хоть убей=) При попытке просмотра картинки тупо перекидывает на главную форума. Если запустить сам скрипт, то ошибок не выдает.

 

Штука на самом деле очень изящная и удобная, хотелось бы чтобы заработала, может кто подскажет что подправить нужно?

Ссылка на комментарий
Поделиться на других сайтах

На данный момент, удалось добиться исправной работы с любыми файлами gif|jpg|png, но на практике это почти не применимо, т.к. картинки всё равно вызываются в виде domain.ru/index.php?act=attach&type=post&id=xxxxx и .htaccess, очевидно, не относит их к "\.(gif|jpg|png)$"

Пробовали что-то вроде <FilesMatch "(act=attach)">, всё равно не обрабатываются.

 

Буду рад, если кто-нить подскажет как можно сделать.

Ссылка на комментарий
Поделиться на других сайтах

1. Что мешает вызывать скрипт из attach.php?

2. И с полупрозрачными PNG работает? :D

Ссылка на комментарий
Поделиться на других сайтах

2. И с полупрозрачными PNG работает?

Да, причем, вполне корректно. Впрочем, не вижу в этом ничего нового-GD нормально приклеивает прозрачный фон, как правило.

1. Что мешает вызывать скрипт из attach.php?

Можно поподробнее? Может какие-то конкретные советы будут?

 

На данный момент, удалось реализовать вызов обработки рисунков скриптом, но теперь проблема в том, что скрипт почему-то туго воспринимает URI с index.php?act=attach&type=post&id=xxxxx, а если ставить URL вместо URI, то получается зацикливание, т.к. при обращении скрипт .htaccess отправляет самого себя самому себе на обработку.

Ссылка на комментарий
Поделиться на других сайтах

Да, причем, вполне корректно. Впрочем, не вижу в этом ничего нового-GD нормально приклеивает прозрачный фон, как правило.

Я имел в виду прозрачный watermark.

 

Можно поподробнее? Может какие-то конкретные советы будут?

 

На данный момент, удалось реализовать вызов обработки рисунков скриптом, но теперь проблема в том, что скрипт почему-то туго воспринимает URI с index.php?act=attach&type=post&id=xxxxx, а если ставить URL вместо URI, то получается зацикливание, т.к. при обращении скрипт .htaccess отправляет самого себя самому себе на обработку.

Мне кажется, раздел не тот :D Обыкновенным образом. Зачем зацикливаться на прикреплении обработчика через .htaccess? Можнео вынести в функцию нанесение вотермарка и отдачу. Далее в скрипте-обработчике нужно читать файл и вызывать эту функцию, а в attach.php найти место, где читается и отдаётся файл из папки /uploads/ и сделать этот вызов там.

Ссылка на комментарий
Поделиться на других сайтах

Я имел в виду прозрачный watermark.

В общем, библиотека GD и сам скрипт, соответственно, адекватно воспринимают прозрачный цвет при наклеивании. Т.е. то, что было прозрачным фоном на рисунке-наклейке будет соответствовать содержимому в этой точке исходного рисунка.

Зачем зацикливаться на прикреплении обработчика через .htaccess?

Потому что по-другому я не умею просто.

Далее в скрипте-обработчике нужно читать файл и вызывать эту функцию, а в attach.php найти место, где читается и отдаётся файл из папки /uploads/ и сделать этот вызов там.

понял, буду искать значит.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.