Уважаемые знатоки, помогите поправить код водяного знака. В коде все работает, изображение водяного знака прикрепляется к правому нижнему боку рисунка. НЕОБХОДИМО: сделать дополнительное изображение знака в верхнем левом углу рисунка. И, самое главное, сделать рисунок знака зависящим от ширины (размеров) основного рисунка. Например рисунок шириной 100% - то знак будет шириной 10%. Заранее благодарю! Код (PHP): waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "bottom=5,right=5"); function waterMark($original, $watermark, $placement = 'bottom=5,right=5', $destination = null) { $original = urldecode($original); $info_o = @getImageSize($original); if (!$info_o) return false; $info_w = @getImageSize($watermark); if (!$info_w) return false; list ($vertical, $horizontal) = split(',', $placement,2); list($vertical, $sy) = split('=', trim($vertical),2); list($horizontal, $sx) = split('=', trim($horizontal),2); switch (trim($vertical)) { case 'bottom': $y = $info_o[1] - $info_w[1] - (int)$sy; break; case 'middle': $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy; break; default: $y = (int)$sy; break; } switch (trim($horizontal)) { case 'right': $x = $info_o[0] - $info_w[0] - (int)$sx; break; case 'center': $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx; break; default: $x = (int)$sx; break; } header("Content-Type: ".$info_o['mime']); $original = @imageCreateFromString(file_get_contents($original)); $watermark = @imageCreateFromString(file_get_contents($watermark)); $out = imageCreateTrueColor($info_o[0],$info_o[1]); imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]); //Тут задаем размер изображения в которые можно добавлять Watermark // $info_o[0] > 250 - ширина изображения должна быть больше 250 px // $info_o[1] > 250 - высота изображения должна быть больше 250 px if( ($info_o[0] > 250) && ($info_o[1] > 250) ) { imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]); } switch ($info_o[2]) { case 1: imageGIF($out); break; case 2: imageJPEG($out); break; case 3: imagePNG($out); break; } imageDestroy($out); imageDestroy($original); imageDestroy($watermark); return true; } ?>
Код (PHP): <?php waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "watermark2.png", "bottom=5,right=5"); function waterMark($original, $watermark, $watermark2, $placement = 'bottom=5,right=5', $destination = null) { $original = urldecode($original); $info_o = @getImageSize($original); if (!$info_o) return false; $info_w = @getImageSize($watermark); $info_w2 = @getImageSize($watermark2); if (!$info_w) return false; list ($vertical, $horizontal) = split(',', $placement,2); list($vertical, $sy) = split('=', trim($vertical),2); list($horizontal, $sx) = split('=', trim($horizontal),2); switch (trim($vertical)) { case 'bottom': $y = $info_o[1] - $info_w[1] - (int)$sy; break; case 'middle': $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy; break; default: $y = (int)$sy; break; } switch (trim($horizontal)) { case 'right': $x = $info_o[0] - $info_w[0] - (int)$sx; break; case 'center': $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx; break; default: $x = (int)$sx; break; } header("Content-Type: ".$info_o['mime']); $original = @imageCreateFromString(file_get_contents($original)); $watermark = @imageCreateFromString(file_get_contents($watermark)); $out = imageCreateTrueColor($info_o[0],$info_o[1]); imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]); //Тут задаем размер изображения в которые можно добавлять Watermark // $info_o[0] > 250 - ширина изображения должна быть больше 250 px // $info_o[1] > 250 - высота изображения должна быть больше 250 px if( ($info_o[0] > 250) && ($info_o[1] > 250) ) { imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]); //2 картинка вверху-слева + процетное соотношение+отступ $x2=0; $y2=0; $height2=(int)1+(1-($info_w2[1]*1/$info_o[1])); $width2=(int)1+(1-($info_w2[0]*1/$info_o[0])); imageCopy($out, $watermark2, $x2, $y2, 0, 0, $width2, $height2); } switch ($info_o[2]) { case 1: imageGIF($out); break; case 2: imageJPEG($out); break; case 3: imagePNG($out); break; } imageDestroy($out); imageDestroy($original); imageDestroy($watermark); return true; } ?> пробуй...
Спасибо, но не получается. отключились даже превьюшки. Поскольку в PHP я дуб дубом, но по-моему эта строка не смасштабирует водяной знак, а просто увеличит область выделенную для него на основном изображении: $height2=(int)1+(1-($info_w2[1]*1/$info_o[1])); $width2=(int)1+(1-($info_w2[0]*1/$info_o[0])); Пока остановился вот на этом: Код (PHP): <? waterMark($_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI'], "watermark.png", "bottom=5,right=5"); function waterMark($original, $watermark, $placement = 'bottom=5,right=5', $destination = null) { $original = urldecode($original); $info_o = @getImageSize($original); //получаем размер исходного изображения if (!$info_o) return false; $info_w = @getImageSize($watermark); //получаем размер водяного знака if (!$info_w) return false; list ($vertical, $horizontal) = split(',', $placement,2); list($vertical, $sy) = split('=', trim($vertical),2); list($horizontal, $sx) = split('=', trim($horizontal),2); switch (trim($vertical)) { case 'bottom': $y = $info_o[1] - $info_w[1] - (int)$sy; break; case 'middle': $y = ceil($info_o[1]/2) - ceil($info_w[1]/2) + (int)$sy; break; default: $y = (int)$sy; break; } switch (trim($horizontal)) { case 'right': $x = $info_o[0] - $info_w[0] - (int)$sx; break; case 'center': $x = ceil($info_o[0]/2) - ceil($info_w[0]/2) + (int)$sx; break; default: $x = (int)$sx; break; } header("Content-Type: ".$info_o['mime']); $original = @imageCreateFromString(file_get_contents($original)); $watermark = @imageCreateFromString(file_get_contents($watermark)); $out = imageCreateTrueColor($info_o[0],$info_o[1]); imageCopy($out, $original, 0, 0, 0, 0, $info_o[0], $info_o[1]); //Тут задаем размер изображения в которые можно добавлять Watermark // $info_o[0] > 250 - ширина изображения должна быть больше 250 px // $info_o[1] > 250 - высота изображения должна быть больше 250 px if( ($info_o[0] > 250) && ($info_o[1] > 250) ) { imageCopy($out, $watermark, $x, $y, 0, 0, $info_w[0], $info_w[1]); //2 картинка вверху-слева + процетное соотношение+отступ $x2=0; $y2=-6; imageCopy($out, $watermark, $x2, $y2, 0, 0, $info_w[0], $info_w[1]); } switch ($info_o[2]) { case 1: imageGIF($out); break; case 2: imageJPEG($out); break; case 3: imagePNG($out); break; } imageDestroy($out); imageDestroy($original); imageDestroy($watermark); return true; } ?>
Ты прав это задаем область - расчет новой ширины и высоты ватемарка; так как я вижу ты воспользовался тем же изображением, тогда перед вместо твоей строчки в коде: Код (PHP): //2 картинка вверху-слева + процетное соотношение+отступ $x2=0; $y2=-6; imageCopy($out, $watermark, $x2, $y2, 0, 0, $info_w[0], $info_w[1]); пишем: Код (PHP): //percent width and height $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])))); //увеличиваем или уменьшаем ватемарк пропорционально $water_img = imageCreateTrueColor($width2, $height2); imageCopyResampled($water_img, $watermark, 0, 0, 0, 0, $width2, $height2, $info_w[0], $info_w[1]); //2 картинка вверху-слева + процетное соотношение+отступ $x2=0; $y2=-6; imageCopy($out, $water_img, $x2, $y2, 0, 0, $width2, $height2); пробуй у меня не где тестировать, должно сработать...