Необходимо отремонтировать код водяного знака

Тема в разделе "Программирование", создана пользователем Kupidon, 17.04.2011.

  1. Offline

    Kupidon Недавно здесь

    Регистрация:
    21.03.2011
    Сообщения:
    17
    Симпатии:
    0
    Пол:
    Мужской
    Уважаемые знатоки, помогите поправить код водяного знака. В коде все работает, изображение водяного знака прикрепляется к правому нижнему боку рисунка. НЕОБХОДИМО: сделать дополнительное изображение знака в верхнем левом углу рисунка. И, самое главное, сделать рисунок знака зависящим от ширины (размеров) основного рисунка. Например рисунок шириной 100% - то знак будет шириной 10%. Заранее благодарю!
    Код (PHP):
    1. waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "bottom=5,right=5");
    2.  
    3. function waterMark($original, $watermark, $placement = 'bottom=5,right=5', $destination = null) {
    4.    $original = urldecode($original);
    5.    $info_o = @getImageSize($original);
    6.    if (!$info_o)
    7.          return false;
    8.    $info_w = @getImageSize($watermark);
    9.    if (!$info_w)
    10.          return false;
    11.  
    12.    list ($vertical, $horizontal) = split(',', $placement,2);
    13.    list($vertical, $sy) = split('=', trim($vertical),2);
    14.    list($horizontal, $sx) = split('=', trim($horizontal),2);
    15.  
    16.    switch (trim($vertical)) {
    17.       case 'bottom':
    18.          $y = $info_o[1] - $info_w[1] - (int)$sy;
    19.          break;
    20.       case 'middle':
    21.          $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy;
    22.          break;
    23.       default:
    24.          $y = (int)$sy;
    25.          break;
    26.       }
    27.  
    28.    switch (trim($horizontal)) {
    29.       case 'right':
    30.          $x = $info_o[0] - $info_w[0] - (int)$sx;
    31.          break;
    32.       case 'center':
    33.          $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx;
    34.          break;
    35.       default:
    36.          $x = (int)$sx;
    37.          break;
    38.       }
    39.  
    40.    header("Content-Type: ".$info_o['mime']);
    41.  
    42.    $original = @imageCreateFromString(file_get_contents($original));
    43.    $watermark = @imageCreateFromString(file_get_contents($watermark));
    44.    $out = imageCreateTrueColor($info_o[0],$info_o[1]);
    45.  
    46.    imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]);
    47.  
    48. //Тут задаем размер изображения в которые можно добавлять Watermark
    49. // $info_o[0] > 250 - ширина изображения должна быть больше 250 px
    50. // $info_o[1] > 250 - высота изображения должна быть больше 250 px
    51.  
    52.    if( ($info_o[0] > 250) && ($info_o[1] > 250) )
    53.    {
    54.    imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]);
    55.    }
    56.  
    57.    switch ($info_o[2]) {
    58.       case 1:
    59.          imageGIF($out);
    60.          break;
    61.       case 2:
    62.          imageJPEG($out);
    63.          break;
    64.       case 3:
    65.          imagePNG($out);
    66.          break;
    67.          }
    68.  
    69.    imageDestroy($out);
    70.    imageDestroy($original);
    71.    imageDestroy($watermark);
    72.  
    73.    return true;
    74.    }
    75.  
    76. ?>
     
  2.  
  3. Offline

    andron_2006_83 Недавно здесь

    Регистрация:
    16.08.2008
    Сообщения:
    17
    Симпатии:
    0
    Пол:
    Мужской
    Код (PHP):
    1. <?php
    2. waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "watermark2.png", "bottom=5,right=5");
    3.  
    4. function waterMark($original, $watermark, $watermark2, $placement = 'bottom=5,right=5', $destination = null) {
    5.    $original = urldecode($original);
    6.    $info_o = @getImageSize($original);
    7.    if (!$info_o) return false;
    8.    $info_w = @getImageSize($watermark);
    9.    $info_w2 = @getImageSize($watermark2);
    10.    if (!$info_w) return false;
    11.    list ($vertical, $horizontal) = split(',', $placement,2);
    12.    list($vertical, $sy) = split('=', trim($vertical),2);
    13.    list($horizontal, $sx) = split('=', trim($horizontal),2);
    14.    switch (trim($vertical)) {
    15.       case 'bottom':
    16.          $y = $info_o[1] - $info_w[1] - (int)$sy;
    17.          break;
    18.       case 'middle':
    19.          $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy;
    20.          break;
    21.       default:
    22.          $y = (int)$sy;
    23.          break;
    24.     }
    25.    switch (trim($horizontal)) {
    26.       case 'right':
    27.          $x = $info_o[0] - $info_w[0] - (int)$sx;
    28.          break;
    29.       case 'center':
    30.          $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx;
    31.          break;
    32.       default:
    33.          $x = (int)$sx;
    34.          break;
    35.       }
    36.    header("Content-Type: ".$info_o['mime']);
    37.    $original = @imageCreateFromString(file_get_contents($original));
    38.    $watermark = @imageCreateFromString(file_get_contents($watermark));
    39.    $out = imageCreateTrueColor($info_o[0],$info_o[1]);
    40.    imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]);
    41.  
    42. //Тут задаем размер изображения в которые можно добавлять Watermark
    43. // $info_o[0] > 250 - ширина изображения должна быть больше 250 px
    44. // $info_o[1] > 250 - высота изображения должна быть больше 250 px
    45.    if( ($info_o[0] > 250) && ($info_o[1] > 250) )
    46.    {
    47.         imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]);
    48.         //2 картинка вверху-слева + процетное соотношение+отступ
    49.         $x2=0; $y2=0;
    50.         $height2=(int)1+(1-($info_w2[1]*1/$info_o[1])); $width2=(int)1+(1-($info_w2[0]*1/$info_o[0]));
    51.         imageCopy($out, $watermark2, $x2, $y2, 0, 0, $width2, $height2);
    52.        
    53.    }
    54.    switch ($info_o[2]) {
    55.     case 1:
    56.          imageGIF($out);
    57.          break;
    58.       case 2:
    59.          imageJPEG($out);
    60.          break;
    61.       case 3:
    62.          imagePNG($out);
    63.          break;
    64.          }
    65.    imageDestroy($out);
    66.    imageDestroy($original);
    67.    imageDestroy($watermark);
    68.    return true;
    69.    }
    70.  
    71.  
    72.  
    73. ?>


    пробуй...[!]
     
  4. Offline

    Kupidon Недавно здесь

    Регистрация:
    21.03.2011
    Сообщения:
    17
    Симпатии:
    0
    Пол:
    Мужской
    Спасибо, но не получается. отключились даже превьюшки.:(
    Поскольку в PHP я дуб дубом, но по-моему эта строка не смасштабирует водяной знак, а просто увеличит область выделенную для него на основном изображении:

    $height2=(int)1+(1-($info_w2[1]*1/$info_o[1])); $width2=(int)1+(1-($info_w2[0]*1/$info_o[0]));


    Пока остановился вот на этом:
    Код (PHP):
    1. <?
    2. waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "bottom=5,right=5");
    3.  
    4. function waterMark($original, $watermark, $placement = 'bottom=5,right=5', $destination = null) {
    5.    $original = urldecode($original);
    6.    $info_o = @getImageSize($original); //получаем размер исходного изображения
    7.    if (!$info_o)          return false;
    8.    $info_w = @getImageSize($watermark); //получаем размер водяного знака
    9.    if (!$info_w)          return false;
    10.  
    11.    list ($vertical, $horizontal) = split(',', $placement,2);
    12.    list($vertical, $sy) = split('=', trim($vertical),2);
    13.    list($horizontal, $sx) = split('=', trim($horizontal),2);
    14.  
    15.    switch (trim($vertical)) {
    16.      case 'bottom':
    17.        $y = $info_o[1] - $info_w[1] - (int)$sy;
    18.        break;
    19.      case 'middle':
    20.          $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy;
    21.          break;
    22.        default:
    23.          $y = (int)$sy;
    24.          break;
    25.       }
    26.  
    27.    switch (trim($horizontal)) {
    28.       case 'right':
    29.          $x = $info_o[0] - $info_w[0] - (int)$sx;
    30.          break;
    31.       case 'center':
    32.          $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx;
    33.          break;
    34.       default:
    35.          $x = (int)$sx;
    36.          break;
    37.       }
    38.  
    39.    header("Content-Type: ".$info_o['mime']);
    40.  
    41.    $original = @imageCreateFromString(file_get_contents($original));
    42.    $watermark = @imageCreateFromString(file_get_contents($watermark));
    43.    $out = imageCreateTrueColor($info_o[0],$info_o[1]);
    44.  
    45.    imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]);
    46.  
    47. //Тут задаем размер изображения в которые можно добавлять Watermark
    48. // $info_o[0] > 250 - ширина изображения должна быть больше 250 px
    49. // $info_o[1] > 250 - высота изображения должна быть больше 250 px
    50.  
    51.    if( ($info_o[0] > 250) && ($info_o[1] > 250) )
    52.    {
    53.    imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]);
    54.  
    55.         //2 картинка вверху-слева + процетное соотношение+отступ
    56.         $x2=0; $y2=-6;
    57.         imageCopy($out, $watermark, $x2, $y2, 0, 0, $info_w[0], $info_w[1]);
    58.           }
    59.  
    60.    switch ($info_o[2]) {
    61.       case 1:
    62.          imageGIF($out);
    63.          break;
    64.       case 2:
    65.          imageJPEG($out);
    66.          break;
    67.       case 3:
    68.          imagePNG($out);
    69.          break;
    70.          }
    71.  
    72.    imageDestroy($out);
    73.    imageDestroy($original);
    74.    imageDestroy($watermark);
    75.  
    76.    return true;
    77.    }
    78.  
    79.  
    80.  
    81. ?>
     
    Последнее редактирование: 19.04.2011
  5. Offline

    andron_2006_83 Недавно здесь

    Регистрация:
    16.08.2008
    Сообщения:
    17
    Симпатии:
    0
    Пол:
    Мужской
    Ты прав это задаем область - расчет новой ширины и высоты ватемарка;
    так как я вижу ты воспользовался тем же изображением, тогда перед вместо твоей строчки в коде:

    Код (PHP):
    1. //2 картинка вверху-слева + процетное соотношение+отступ
    2.         $x2=0; $y2=-6;
    3.         imageCopy($out, $watermark, $x2, $y2, 0, 0, $info_w[0], $info_w[1]);


    пишем:

    Код (PHP):
    1. //percent width and height
    2. $height2=(int)($info_w[1]*(1+(1-($info_w[1]/$info_o[1])))); $width2=(int)($info_w[0]*(1+(1-($info_w[0]/$info_o[0]))));
    3. //увеличиваем или уменьшаем ватемарк пропорционально
    4. $water_img = imageCreateTrueColor($width2, $height2);
    5. imageCopyResampled($water_img, $watermark, 0, 0, 0, 0, $width2, $height2, $info_w[0], $info_w[1]);
    6. //2 картинка вверху-слева + процетное соотношение+отступ
    7. $x2=0; $y2=-6;
    8. imageCopy($out, $water_img, $x2, $y2, 0, 0, $width2, $height2);


    пробуй у меня не где тестировать, должно сработать...
     
    Последнее редактирование: 19.04.2011
  6. Offline

    Kupidon Недавно здесь

    Регистрация:
    21.03.2011
    Сообщения:
    17
    Симпатии:
    0
    Пол:
    Мужской
    пока не могу попробовать. завтра обязательно проверю. Еще раз спасибо. обязательно отпишусь.
     

Поделиться этой страницей

Загрузка...