Наложение watermark на кратинку

Spear

почемучка
Наложение watermark на кратинку

Здравствуйте,
у меня такая проблема- пытаюсь сделать скрипт, который будет выводить нужную картинку, накладывая на неё так называемый watermark.
На форуме тем много по поводу ГД, но ничего конкретного ненашел :( я с ГД раньше не работал, поэтому парочку топиков более-менее содержательных - не понял.

Вообщем вот есть такой код, хотел бы узнать - насколько он удобен для использования?

PHP:
<?php
$watermark = "water.png";

$im = imagecreatefrompng($watermark);

$image = $_GET['image'];

$types = array(1 => "gif", 2 => "jpeg", 3 => "png");
if ($image_info = @getimagesize($image))
{
  $image_create_handle = "imagecreatefrom".$types[$image_info[2]];
  if (!$im2 = @$image_create_handle($image))
  {
    die("Error opening $image!");
  }

  imagecopy($im2, $im, (imagesx($im2)/100)-(imagesx($im)/100), (imagesy($im2)/100)-(imagesy($im)/100), 0, 0, imagesx($im), imagesy($im));

  if($_GET[repeat])
  {
    $waterless = imagesx($im2) - imagesx($im);
    $rest = ceil($waterless/imagesx($im)/1);

    for($n=1; $n<=$rest; $n++)
    {
      imagecopy($im2, $im, ((imagesx($im2)/100)-(imagesx($im)/100))-(imagesx($im)*$n), (imagesy($im2)/100)-(imagesy($im)/100), 0, 0, imagesx($im), imagesy($im));
      imagecopy($im2, $im, ((imagesx($im2)/100)-(imagesx($im)/100))+(imagesx($im)*$n), (imagesy($im2)/100)-(imagesy($im)/100), 0, 0, imagesx($im), imagesy($im));
    }
  }

  header("Content-Type: image/jpeg");
  imagejpeg($im2, $destination, 90);
  imagedestroy($im);
  imagedestroy($im2);
}
else
{
  die("Error opening $image!");
}
?>
Что посоветуете?

-~{}~ 16.06.05 20:37:

Пока проблема в чем - если ставить качество картинки 100, то при выводе новой (с наложенным ватермарком) размер картинки получается больше чем оригинала (примерно на 200 кб)
 

SiMM

Новичок
> Пока проблема в чем - если ставить качество картинки 100
Ну так не ставь 100. Подбери подходящее значение по соотношению размер/качество эмпирически.
 

Spear

почемучка
SiMM
так и сделал.. 97. Но я спросил потому что вдруг есть какой-то более профессиональный подход ;)

Ещё вопрос - как думаете, возможно ли подобный скрипт замаскировать (реврайтом), чтобы пользователь не догадался что картинка генериться скриптом, а думал что она так и лоежит на сервере?
 

yugene

Отошел от дел
Автор оригинала: Spear
Ещё вопрос - как думаете, возможно ли подобный скрипт замаскировать (реврайтом), чтобы пользователь не догадался что картинка генериться скриптом, а думал что она так и лоежит на сервере?
Возможно
 

Spear

почемучка
по вопросу маскировки - уже сделал ;)

Теперь более сложный вопрос -

Подскажите, пожалуйста. где в вышенаписанном коде (я его сам не писал, конечно. Нашел то ли на рнр.нет или ещё где.. непомню. Нашёл давно, сохранил до "лучших времен") описывается место, куда пришпилится ватермарк? Ато он сейчас справа ввехру. Я хотел бы сделать рендом по 4ем позициям (справа вверху, слева вверху ну и внищзу слева и справа)
 

SiMM

Новичок
[m]gd[/m] и вперёд читать, что каждая используемая функция делает.
 

Spear

почемучка
SiMM
ну а все-таки? Это же 1 строчка из кода :) Я пока всю док-цию прочту...

-~{}~ 16.06.05 21:15:

хех, уже разобралси ;) Спасибо )

-~{}~ 17.06.05 06:27:

ПРОБЛЕМА! СЕРЬЕЗНАЯ! :(:(

imagejpeg($im2, $destination, 90);

этот код отвечает за качество картинки. проблема вот в чем:

это портит картинку, тоесть её обьем.
Например если картинка весит сама 170 кб, то после наложения марки может весить 260!

Я пробовал подобрать среднее значение.. Но всеравно ничего не получается.
На одной картинке если я ставлю качество 87 то примерно исходный файл по "весу" будет равен сгенерированному, а на другом файле в такими же настройками исходный будет гораздо "тяжелее", ещё на одном - легче, но и качество испортится..
Я даже незнаю как поступить :( посоветуйте, пожалуйста! Может быть есть какой-то способ? Очень-очень надеюсь!
 

SiMM

Новичок
> Я даже незнаю как поступить
Поставить 30

> Может быть есть какой-то способ?
Нет и быть не может. Предсказать, на сколько сожмётся конкретный файл, невозможно в принципе.
 

Spear

почемучка
Ещё вопрос - вот у меня генерируется кратинка с ватермаркой. Но если юзер обновит страницу - она будет опять генерироваться. Можно ли как-то сказать браузеру грузить картинку из кеша?
 

kruglov

Новичок
Храним в отдельной папке обработанные варианты картинок.

if(запрошена картинка, которой еще нету){
генерим, записываем (второй аргумент imagejpeg).
}

отдаем через readfile картинку.

Можно через mod_rewrite сделать - если картинка не существует, кидаем на скрипт, иначе отдаем картинку.
 

SiMM

Новичок
kruglov, отдавать картинку через readfile будет не достаточно - нужно ещё за заголовками следить (напоминаю, речь о КЛИЕНТСКОМ кэшировании). Тогда уж проще делать Location на картинку, лежащую на сервере - остальное сделает Апач (если забыть про mod_rewrite).
 

Spear

почемучка
SiMM
Хм, по поводу хранения сгенерированной картинки - идея хороша.
Правда, соответственно увеличится объем занимаемого места картинками (х2). Но тут можно уже и сделать чистку сгенерированных картинок - раз в сутки. Будет достаточно. Дело в том что картинок у меня будет довольно-таки много (их уже около 1000. Будет раз в 100 больше как минимум).

Только такое уточнение - мой код (точнее не мой, а тот который я испольщую) может генерировать картинку и сохранять её куда необходимо? Какой функцией желательно пользоваться? Буду рад.
 

SiMM

Новичок
Крайне полезно читать мануал. Как по GD в целом, так и по используемым тобой функциям. Тебе будет достаточно ознакомиться с [m]imagejpeg[/m]
 

kvf77

Red Devil
Spear

а ты уверен, что тебе оригинальные (без ватермарка) картинки нужны? может имеет смысл хранить тока картинки с ватермарками?
 

Spear

почемучка
SiMM
спасибо, сейчас и займусь этим. Вчера не успел - сессия :(

kvf77
впринципе не уверен. Но рпосто хочу в будущем дать юзеру возможность "ужимать" выводимые картинки. Например у меня разрешение экрана - 800х600, а картинка - 1024х768. И дам юзеру возможность изменить разрешение генерируемой картинки.
 

kvf77

Red Devil
Spear
ну не знаю, насколько это оправдано, щас большинство браузеров и так могут сразу показывать картинки уменьшеные для удобства да изверь может ее уменьшить в фотошопе, коли ему приглянулась картинка.
 

Spear

почемучка
РНР.нет очень полезный ресурс ,(Америку открыл. да? :))

вот что я там нашел:

PHP:
I came across a problem where Internet Explorer refused to cache some dynamically created images. To get round this, send out a Last-Modified header. 

Eg: 

<?php 

header('Last-Modified: '.gmdate('D, d M Y H:i:s', $timestamp).' GMT'); 
header('Content-Type: image/jpeg'); 
imagejpeg($photo); 

?>
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $timestamp).' GMT'); - Отлично работает. Вот только незнаю - насколько эффективно и стоит ли использовать?

-~{}~ 19.06.05 04:21:

?
 

Архивариус

Новичок
Накладываю на изображение watermark, и не получается сделать совсем прозрачный фон, получается "нашлепкой". Пробовал менять параметры imagecopymerge($img, $watermark, 0, 0, 0, 0, $watermark_width, $watermark_height, 50); - сама надпись watermark-а бледнеет вместе с фоном.

Как сделать совсем прозрачный фон watermark и яркую надпись?
 
Сверху