За последние 24 часа нас посетили 17823 программиста и 1627 роботов. Сейчас ищет 1571 программист ...

обработка изображений в цикле

Тема в разделе "Вопросы от блондинок", создана пользователем basist, 4 сен 2007.

  1. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    есть скрипт, добавляющий водяной знак на изображение:

    PHP:
    1.  
    2. <?php
    3.         include 'api.watermark.php';
    4.         $watermark = new watermark();
    5.        
    6.         $main_img_obj = imagecreatefromjpeg($_GET['main']);
    7.         $watermark_img_obj = imagecreatefrompng($_GET['watermark']);
    8.         $return_img_obj = $watermark->create_watermark($main_img_obj, $watermark_img_obj, 66);
    9.  
    10.         imagejpeg($return_img_obj, 'rezult/main.jpg', 50);
    11. ?>
    12.  
    если его вызывать так: http://localhost/vod_znak/image.php?mai ... ermark.png, то он создаёт изображение в каталоге rezult. Надо чтобы скрипт обрабатывал каталог с изображениями (from), и писал в другой каталог (to) те же изображения, но уже с водяным знаком.

    делаю так:

    PHP:
    1.  
    2.  <?php
    3.  error_reporting(E_ALL);
    4.  
    5.  $from = "from/";  //  Директория, откуда будем брать фотки
    6.  $to = "to/";          //  Директория, куда будем класть фотки
    7.  
    8.  
    9.  $watermark = "watermark.png";  // Картинка с водяным знаком
    10.  
    11.      include 'api.watermark.php';
    12.      $watermark = new watermark();
    13.  
    14.  $dir_pointer = opendir("$from");            
    15.  
    16.  while (($res = readdir($dir_pointer))!==FALSE){ // обрабатываем файлы
    17. $path = $from . $res;                                        //  каталога. при
    18.                                                                        //  условии, что там
    19.                                                                        //  ТОЛЬКО картинки *.jpg
    20.    if (is_file($path)){
    21.          $main_img_obj = imagecreatefromjpeg($path);
    22.          $watermark_img_obj = imagecreatefrompng($watermark);
    23.          $return_img_obj = $watermark->create_watermark($main_img_obj, $watermark_img_obj, 66);
    24.          imagejpeg($return_img_obj, "$to$res", 50);  // пишем результат в каталог
    25.    }
    26.  }
    27.  closedir($dir_pointer);  
    28.  ?>
    29.  
    создаёт картинки, но без водяного знака, и выдаёт кучу ошибок типа:

    Код (Text):
    1.  
    2. Warning: imagesx(): supplied argument is not a valid Image resource in z:\home\localhost\www\vod_znak\api.watermark.php on line 9
    api.watermark.php :

    PHP:
    1.  
    2. <?php
    3.  
    4. class watermark{
    5.  
    6. # функция, которая сливает два исходных изображения в одно
    7. function create_watermark( $main_img_obj, $watermark_img_obj, $alpha_level = 100 ){
    8.     $alpha_level/= 100;  # перевод значения прозрачности альфа-канала из % в десятки
    9.  
    10. # рассчет размеров изображения (ширина и высота)
    11.    $main_img_obj_w        = imagesx( $main_img_obj );
    12.     $main_img_obj_h        = imagesy( $main_img_obj );
    13.     $watermark_img_obj_w   = imagesx( $watermark_img_obj );
    14.     $watermark_img_obj_h   = imagesy( $watermark_img_obj );
    15.  
    16. # определение координат точки, где будет левый верхний угол водяного знака.
    17. # водяной знак располагается в правом нижнем углу
    18.    $main_img_obj_min_x   = floor( ( $main_img_obj_w ) - ( $watermark_img_obj_w ) );
    19.     $main_img_obj_max_x   = ceil ( $main_img_obj_w );
    20.  
    21.     $main_img_obj_min_y   = floor( ( $main_img_obj_h ) - ( $watermark_img_obj_h ));
    22.     $main_img_obj_max_y   = ceil ( $main_img_obj_h );
    23.  
    24. # создание нового изображения
    25.  $return_img = imagecreatetruecolor( $main_img_obj_w, $main_img_obj_h );
    26.  
    27.  
    28.   for( $y = 0; $y < $main_img_obj_h; $y++ ){  # проходим всё изображение
    29.    for( $x = 0; $x < $main_img_obj_w; $x++ ){
    30.  
    31.        $return_color = NULL;
    32. # определение истинного расположения пикселя в пределах нашего водяного знака
    33.       $watermark_x = $x - $main_img_obj_min_x;
    34.        $watermark_y = $y - $main_img_obj_min_y;
    35. # выбор информации о цвете для наших изображений    
    36.        $main_rgb = imagecolorsforindex( $main_img_obj, imagecolorat( $main_img_obj, $x, $y ) );
    37. # если пиксель водяного знака непрозрачный
    38.       if ( $watermark_x >= 0 && $watermark_x < $watermark_img_obj_w &&
    39.             $watermark_y >= 0 && $watermark_y < $watermark_img_obj_h ) {
    40.              
    41.             $watermark_rbg = imagecolorsforindex( $watermark_img_obj, imagecolorat( $watermark_img_obj, $watermark_x, $watermark_y ) );
    42.  
    43. # использование значения прозрачности альфа-канала
    44.       $watermark_alpha = round( ( ( 127 - $watermark_rbg['alpha'] ) / 127 ), 2 );
    45.        $watermark_alpha = $watermark_alpha * $alpha_level;
    46.  
    47. # расчет цвета в месте наложения картинок
    48.  
    49.        $avg_red = $this->_get_ave_color( $main_rgb['red'], $watermark_rbg['red'], $watermark_alpha );
    50.        $avg_green = $this->_get_ave_color( $main_rgb['green'], $watermark_rbg['green'],        $watermark_alpha );
    51.        $avg_blue = $this->_get_ave_color( $main_rgb['blue'], $watermark_rbg['blue'],                $watermark_alpha );
    52.  
    53. # используя полученные данные, вычисляем индекс цвета  
    54.       $return_color = $this->_get_image_color( $return_img, $avg_red, $avg_green, $avg_blue );
    55.        } else {  # если же не получиться выбрать цвет, то просто возьмем копию исходного пикселя
    56.             $return_color = imagecolorat( $main_img_obj, $x, $y );
    57.          }
    58.  
    59.  
    60.  
    61. # из полученных пикселей рисуем новое изоборажение
    62.    imagesetpixel( $return_img, $x, $y, $return_color );
    63.      }
    64.    }
    65.                 return $return_img;
    66.         }
    67.  
    68. # функция для "усреднения" цветов изображений
    69.    function _get_ave_color( $color_a, $color_b, $alpha_level ) {
    70.        return round( ( ( $color_a * ( 1 - $alpha_level ) ) + ( $color_b * $alpha_level ) ) );
    71.         }
    72.  
    73. # функция, которая находит ближайшие RGB-цвета для нового изображения
    74.        function _get_image_color($im, $r, $g, $b) {
    75.                 $c=imagecolorexact($im, $r, $g, $b);
    76.                 if ($c!=-1) return $c;
    77.                 $c=imagecolorallocate($im, $r, $g, $b);
    78.                 if ($c!=-1) return $c;
    79.                 return imagecolorclosest($im, $r, $g, $b);
    80.         }
    81. }
    82. ?>
    83.  
    84.  
    Как решить эту проблему?

    извините за очень большой пост
     
  2. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    $path откуда взялась?
     
  3. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    $path = $dir . $res; - полный путь к файлу (это уже в цикле)

    он там был.. копировал сюда по частям и не скопировал.
     
  4. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    Может быть неправильно работаю с классом?
    какие варианты?
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    привести код в порядок. прокоментировать основные куски.

    поставить везде error_reporting(E_ALL)

    по сути

    $main_img_obj = imagecreatefromjpeg($path);

    path кривой. покажи что в нем?

    читать этот фарш - неохота
     
  6. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    исправил.

    вроде нормальный, картинки же создаются...
    в нём "from/img.jpg"
     
  7. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    Эх... пришлось сделать так:
    запускаем такой скрипт:
    PHP:
    1.  
    2. <?php
    3.  
    4.  $from = "from/";  //  Директория, откуда будем брать фотки
    5.  $to = "to/";       //  Директория, куда будем класть фотки
    6.  
    7.      include 'api.watermark.php';
    8.      $watermark = new watermark();
    9.  
    10.  $dir_pointer = opendir("$from");            
    11.  
    12.  while (($res = readdir($dir_pointer))!==FALSE){
    13. $path = $from . $res;                            
    14. echo $path, '<br>';
    15.    if (is_file($path)){
    16. echo "<img src=\"image.php?main=$path&watermark=watermark.png&name=$res\">";
    17.    }
    18.  }
    19.  closedir($dir_pointer);  
    20. ?>
    21.  
    22.  
    image.php в свою очередь стал выглядеть так:

    PHP:
    1.  
    2. <?php
    3.         $name = $_GET['name'];
    4.         include 'api.watermark.php';
    5.         $watermark = new watermark();
    6.        
    7.         $main_img_obj = imagecreatefromjpeg($_GET['main']);
    8.         $watermark_img_obj = imagecreatefrompng($_GET['watermark']);
    9.         $return_img_obj = $watermark->create_watermark($main_img_obj, $watermark_img_obj, 66);
    10. echo $name, '<br>';
    11.         imagejpeg($return_img_obj, "to/$name", 50);
    12. ?>
    13.  
    криво конечно, но другого выхода пока не нашёл :(
    всем спасибо
     
  8. pel

    pel Активный пользователь

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    в скрипте, который "делаю так:", после 21й строки сравните $main_img_obj с $watermark_img_obj и $path c $watermark
    и на 8ю и 11ю строки обратите внимание
     
  9. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    не понял. что Вы имеете в виду?

    ммда уж... стыдно ))
     
  10. basist

    basist Активный пользователь

    С нами с:
    7 июл 2007
    Сообщения:
    388
    Симпатии:
    0
    Адрес:
    Орел
    заменил

    PHP:
    1. <?php
    2. $watermark = "watermark.png";
    3. ?>
    на

    PHP:
    1. <?php
    2. $watermark2 = "watermark.png";
    3. ?>
    и

    PHP:
    1. <?php
    2. $watermark_img_obj = imagecreatefrompng($watermark);
    3. ?>
    на

    PHP:
    1. <?php
    2. $watermark_img_obj = imagecreatefrompng($watermark2);
    3. ?>
    с кучей ошибок, но заработало :)
    Спасибо.