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

ЗАПИСЬ ВОДЯНЫХ ЗНАКОВ НА JPG-ФАЙЛЫ (сразу на все из папки в папку)

Вот решил выложить php-скрипт для записи водяных знаков сразу на все фото автоматически с перезаписью их в другую папку (при желании в ту же). Навеяло на такое желание то, что сам постоянно в интернете ищу скрипты для себя и переделываю потом под свои нужды, т.к. своих мозгов не хватает с нуля написать какой-нибудь скрипт. Скрипт состоит ВСЕГО из 4 файлов!

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

Все максимально закомментировано, поэтому всем должно быть все понятно. А при минимальных знаниях php можете переделать его под свои нужды.

На всякий случай разжую: надо самим создать файл (картинку) водяного знака watermark.png (например в фотошопе), лучше на полупрозрачном фоне, так красивее выглядит в итоге. У меня в скрипте подогнано под водяной знак высотой 14 пикселей, так что можете свой watermark.png сделать такой же высоты или тогда переправьте в скрипте соответствующие размеры. Далее надо создать пустой файл imagerewrite.dat, залить их на сервер (например в корень сайта) + залить туда же файлы imagerewrite.php и api.watermark.php, исправить имена каталогов и/или пути к ним под свои (откуда-куда переписывать) в файле imagerewrite.php.
Запускаете потом imagerewrite.php в адресной строке своего браузера с учетом того, в какой папке он лежит, и уходите спокойно курить пока браузер с сервером между собой общаются :). Т.е. в выложенном варианте скрипта будет происходить запись (нанесение водяного знака) на 4 фотки, через 70 секунд страница сама перезагрузится для записи на следующие 4 фотки и т.д. Короче на автомате работает все :)

Код файла imagerewrite.php:


<HTML><HEAD><TITLE>ЗАПИСЬ ВОДЯНЫХ ЗНАКОВ НА JPG-ФАЙЛЫ (из папки в папку)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META http-equiv="Refresh" content="70; URL=<?php echo "http://".$_SERVER['HTTP_HOST']."/imagerewrite.php"; ?>">
<META content=Russian name=Language>
<META content=noindex name=Robots>
</HEAD>
<body>
<?php
// ЗАПИСЬ ВОДЯНЫХ ЗНАКОВ НА ВСЕ JPG-ФАЙЛЫ, ЛЕЖАЩИЕ В ПАПКЕ-БАЗЕ ДАННЫХ

// подключаем наш класс 'watermark'
include "api.watermark.php";

//типа конфига:
$data="data"; // Имя каталога, из которого будем вытаскивать картинки
$data1="data1"; // Имя каталога, в который будем записывать картинки с водяными знаками
$imagerewritedat="imagerewrite.dat"; // база-список уже переделанных файлов-картинок для проверки
$kmax=4; // установка предела количества перезаписываемых фоток за 1 раз (чтоб хостинг не ругался)
$day="su"; // день недели или время - что хотите пишите для себя

// Выводим список всех файлов в каталоге
if ($handle = opendir($data))
{
echo "Папка каталога: $data<br>";
echo "Дескриптор каталога: $handle<br>";
echo "Список файлов:<br>";
$k=0;
// Правильный способ чтения элементов каталога, т.е. с проверкой на отсутстие файлов.
while (false !== ($file = readdir($handle)))
{
// echo "$file\n";
$ok="нет";
$filejpgcheck=substr($file, -3); // вытаскиваем последние 3 символа имени файла, т.е. его расширение
$filejpgcheck=strtolower ($filejpgcheck); // переводим расширение файла в нижний регистр (вдруг JPG попадется)
if ($filejpgcheck=="jpg" || $filejpgcheck=="jpeg") // проверка, что это jpg-картинка, а на gif вод.знаки не наложатся!
{
$filesmjpgcheck=substr($file, 0, 3); // вытаскиваем первые 3 символа имени файла для проверки ресайза
if ($filesmjpgcheck!="sm-") // проверка, что картинка НЕ ресайз? т.е. нет приставки "sm-" (хотя у Вас может другая быть приставка на джипегах)
{
echo "<br>ФОТО: <b>$file</b>, ";
$fotoname = $file; // задаем имя файла для записи в базу для проверки совпадений

// проверка на совпадения с базой уже перезаписанных файлов
if (is_file($imagerewritedat))
{
$lines = file($imagerewritedat); $maxi=count($lines); $i=0;
do {$dt=explode("|", $lines[$i]); $i++;
if ($dt[0]==$file) { $ok=1;}
} while($i < $maxi);
}
echo "наличие совпадений: ".$ok.", ";

if ($ok!=1){
$watermark = new watermark();
// создаем объекты-изображения используя исходные файлы с расширением jpg из заданной папки и
// водяного знака watermark.png, который заранее Вам надо нарисовать в фотошопе например.
$main_img_obj = imagecreatefromjpeg($data."/".$file);
$watermark_img_obj = imagecreatefrompng("watermark.png");

// создаем изображение с водяным знаком - значение прозрачности альфа-канала водяного знака установим в 66%
$return_img_obj = $watermark->create_watermark( $main_img_obj,
$watermark_img_obj, 66 );

// Пустые вычки '' вместо пути - выводим jpeg-файл прямым потоком в браузер (на сайт) или 'папка/имя файла' - записываем наше изображение с водяным знаком и качеством 75%
$file=imagejpeg( $return_img_obj, $data1."/".$file, 75 );


// записываем базу-список готовых файлов-картинок для последующей проверки
//echo "$fotoname - имя файла для записи в базу<br>";
$text="$fotoname|$day|";
$fp=fopen($imagerewritedat,"a+");
flock ($fp,LOCK_EX);
fputs($fp,"$text\r\n");
fflush ($fp); //очищение файлового буфера
flock ($fp,LOCK_UN);
fclose($fp);
@chmod($imagerewritedat, 0644);

echo "<font color=\"#ff3366\"> перезаписано!</font>";
$k=$k+1;
}

}
}
if ($k==$kmax) {
$itogo=$maxi+1;
echo "<br><b>Всего в новой папке: ".$itogo."</b>";
echo "<p><font color=\"#ff3366\">ДОСТИГНУТ ПРЕДЕЛ УСТАНОВЛЕННОГО КОЛИЧЕСТВА ПЕРЕЗАПИСЫВАЕМЫХ ФАЙЛОВ - $k
<p>Страница будет заново перезагружена автоматически!<p></font>";
break;}
} // Закончили весь процесс и закрываем папку

closedir($handle);

}

?>

 

Код файла api.watermark.php:


<?php
class watermark{

// функция, которая сливает два исходных изображения в одно
function create_watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100 )
{
// переводим значение прозрачности альфа-канала из % в десятки
$alpha_level/= 100;

// расчет размеров изображения (ширина и высота)
$main_img_obj_w = imagesx( $main_img_obj );
$main_img_obj_h = imagesy( $main_img_obj );
$watermark_img_obj_w = imagesx( $watermark_img_obj );
$watermark_img_obj_h = imagesy( $watermark_img_obj );

// определение координат центра изображения по ширине для наложения водяного знака в центр фото
$main_img_obj_min_x=floor(($main_img_obj_w/2)-($watermark_img_obj_w/2));
$main_img_obj_max_x=ceil(($main_img_obj_w/2)+($watermark_img_obj_w/2));
// определение координат центра изображения по высоте для наложения водяного знака в центр фото
// $main_img_obj_min_y=floor(($main_img_obj_h/2)-($watermark_img_obj_h/2));
// $main_img_obj_max_y=ceil(($main_img_obj_h/2)+($watermark_img_obj_h/2));
// определение координат изображения по высоте для наложения водяного знака - мы задаем координаты низа фото
$main_img_obj_min_y=floor(($main_img_obj_h)-17); // отступ от низа фото при условии высоты вод.знака watermark.png - 14 пикселей
$main_img_obj_max_y=ceil(($main_img_obj_h)-3); // отступ от низа фото при условии высоты вод.знака watermark.png - 14 пикселей

// создание нового изображения
$return_img = imagecreatetruecolor( $main_img_obj_w, $main_img_obj_h );


// пройдемся по изображению
for( $y = 0; $y < $main_img_obj_h; $y++ )
{
for ($x = 0; $x < $main_img_obj_w; $x++ )
{
$return_color = NULL;

// определение истинного расположения пикселя в пределах
// нашего водяного знака
$watermark_x = $x - $main_img_obj_min_x;
$watermark_y = $y - $main_img_obj_min_y;

// выбор информации о цвете для наших изображений
$main_rgb = imagecolorsforindex( $main_img_obj,
imagecolorat( $main_img_obj, $x, $y ) );

// если наш пиксель водяного знака непрозрачный
if ($watermark_x >= 0 && $watermark_x < $watermark_img_obj_w &&
$watermark_y >= 0 && $watermark_y < $watermark_img_obj_h )
{
$watermark_rbg = imagecolorsforindex( $watermark_img_obj,
imagecolorat( $watermark_img_obj,
$watermark_x,
$watermark_y ) );

// использование значения прозрачности альфа-канала
$watermark_alpha = round(((127-$watermark_rbg['alpha'])/127),2);
$watermark_alpha = $watermark_alpha * $alpha_level;

// расчет цвета в месте наложения картинок
$avg_red = $this->_get_ave_color( $main_rgb['red'],
$watermark_rbg['red'], $watermark_alpha );
$avg_green = $this->_get_ave_color( $main_rgb['green'],
$watermark_rbg['green'], $watermark_alpha );
$avg_blue = $this->_get_ave_color( $main_rgb['blue'],
$watermark_rbg['blue'], $watermark_alpha );

// используя полученные данные, вычисляем индекс цвета
$return_color = $this->_get_image_color(
$return_img, $avg_red, $avg_green, $avg_blue );

// если же не получиться выбрать цвет, то просто возьмем
// копию исходного пикселя
} else { $return_color = imagecolorat( $main_img_obj, $x, $y ); }

// из полученных пикселей рисуем новое изображение
imagesetpixel($return_img, $x, $y, $return_color );
}
} // прошлись по изображению

// отображаем изображение с водяным знаком
return $return_img;

} // конец функции create_watermark()


// усреднение двух цветов с учетом прозрачности альфа-канала
function _get_ave_color( $color_a, $color_b, $alpha_level )
{
return round((($color_a*(1-$alpha_level))+($color_b*$alpha_level)));
}

// возвращаем значения ближайших RGB-составляющих нового рисунка
function _get_image_color($im, $r, $g, $b)
{
$c=imagecolorexact($im, $r, $g, $b);
if ($c!=-1) return $c;
$c=imagecolorallocate($im, $r, $g, $b);
if ($c!=-1) return $c;
return imagecolorclosest($im, $r, $g, $b);
}

} // конец класса watermark()
?>

 

Получиться должно типа такого фото с водяным знаком внизу:

фото с водяным знаком

В общем, копируем коды, вставляем в созданые под указанными выше именами файлы и все.

После заливки на хостинг этих 4 файлов (imagerewrite.php, api.watermark.php, imagerewrite.dat, watermark.png) права на них можете не менять. Чтоб хостинг не ругался на скрипт и не отрубал аккаунт в тэге <мета> с рефрешем установлена перезагрузка страницы через 70 секунд, т.к. нанесение водяных знаков дает большую нагрузку на сервер и занимает некоторое время. Если же у Вас имеется выделенный сервер, то можете поэкспериментировать с настройками. Адрес урла в этом тэге предполагает, что все файлы скрипта залиты в корень сайта, поэтому возможно Вам надо будет его изменить, если будете заливать скрипт во вложенную папку.

По умолчанию, права на любом хостинге 640 или 644 установлены и этого достаточно.

Ну вот собственно и все. Может кому и пригодится.

 

!!! скрипт вызова директа | скрипт гонга !!!

Здесь должна быть красивая картинка на флэше, хотя ее нет. Но все права на нее защищены заранее.