2014-02-18 6 views
1

Мне нужно добавить прозрачный водяной знак (прозрачность в конечном изображении - 80%). Я создал эту функцию, чтобы справиться с этим:Добавить прозрачный водяной знак в изображение

function ImageAddWatermark($im, $stamp, $onLeft, $onTop, $margin){  
     // $stamp = imagecreatformpng(...) -> GD resource? 
     // not important part - it calculates position of watermark 
     if($onLeft){ 
      $orgX = $margin; 
     } else { 
      $orgX = imagesx($im)-$margin-imagesx($stamp); 
     } 

     if($onTop){ 
      $orgY = $margin; 
     }else { 
      $orgY = imagesy($im)-$margin-imagesy($stamp); 
     } 

     imagecopymerge($im, $stamp, $orgX, $orgY, 0, 0, imagesx($stamp), imagesy($stamp), 50); 

     return $im; 
    } 

Результат функции: error

Но imagecopymerge возвращает черный фон вместо прозрачного. Я даже слышал некоторые мнения, что imagecopymerge не совсем подходит для создания прозрачных водяных знаков ...

Так что вопрос: «Как добавить прозрачный водяной знак (используя альфа?) В jpeg-фото?» Как я могу избавиться от этого черного backgound? (В исходном файле PNG прозрачен)

+0

что такое '$ stamp', прежде чем вы вызовете эту функцию? это ресурс GD? как вы его загрузили? – cmorrissey

+0

@cmorrissey, если ресурс GD «imagecreatefrompng (...)», и, конечно, я его называю – tomascapek

+0

add 'imagealphablending ($ stamp, true);' после вызова 'imagecreatefrompng (...)' – cmorrissey

ответ

0

Ну, я нашел решение:

функции ImageAddWatermark ($ IM, $ печать, $ onLeft, $ ONTOP, $ наценка) {

if($onLeft){ 
     $orgX = $margin; 
    } else { 
     $orgX = imagesx($im)-$margin-imagesx($stamp); 
    } 

    if($onTop){ 
     $orgY = $margin; 
    }else { 
     $orgY = imagesy($im)-$margin-imagesy($stamp); 
    } 

    // creating a cut resource 
    $cut = imagecreatetruecolor(imagesx($stamp), imagesy($stamp)); 

    // copying relevant section from background to the cut resource 
    imagecopy($cut, $im, 0, 0, $orgX, $orgY, imagesx($stamp), imagesy($stamp)); 

    // copying relevant section from watermark to the cut resource 
    imagecopy($cut, $stamp, 0, 0, 0, 0, imagesx($stamp), imagesy($stamp)); 

    // insert cut resource to destination image 
    imagecopymerge($im, $cut, $orgX, $orgY, 0, 0, imagesx($stamp), imagesy($stamp), 50); 

    return $im; 
} 
Смежные вопросы