обработка изображений — повторное переполнение стека водяным знаком

я использую Изображение вмешательства библиотека манипуляций с изображениями этой библиотеки в проекте, и я застрял при добавлении изображения водяного знака на всем протяжении исходного изображения.

Можно ли повторить изображение водяного знака на всем исходном изображении, как в следующем примере?

акции-фото-79576145-старый номер

Я пытаюсь следующий код, но он не работает для меня.

$thumbnail = $manager->make($name);
$watermark = $manager->make($watermarkSource);
$x = 0;

while ($x < $thumbnail->width()) {
$y = 0;

while($y < $thumbnail->height()) {
$thumbnail->insert($watermarkSource, 'top-left', $x, $y);
$y += $watermark->height();
}

$x += $watermark->width();
}

$thumbnail->save($name, 80);

1

Решение

Я только что решил эту проблему с помощью библиотеки изображений Intervention, используя ее в Laravel Framework. Итак, вот фрагмент кода.

public function watermarkPhoto(String $originalFilePath,String $filePath2Save ){

$watermark_path='photos/watermark.png';
if(\File::exists($watermark_path)){

$watermarkImg=Image::make($watermark_path);
$img=Image::make($originalFilePath);
$wmarkWidth=$watermarkImg->width();
$wmarkHeight=$watermarkImg->height();

$imgWidth=$img->width();
$imgHeight=$img->height();

$x=0;
$y=0;
while($y<=$imgHeight){
$img->insert($watermark_path,'top-left',$x,$y);
$x+=$wmarkWidth;
if($x>=$imgWidth){
$x=0;
$y+=$wmarkHeight;
}
}
$img->save($filePath2Save);

$watermarkImg->destroy();
$img->destroy(); //  to free memory in case you have a lot of images to be processed
}
return $filePath2Save;
}

Если вы используете версию PHP до 7, удалите объявление типа String из аргументов функции. просто сделай это

    public function watermarkPhoto($originalFilePath, $filePath2Save ){....}

Также, если вы не используете Laravel Framework и у вас нет включенного класса File, просто удалите избыточность и проверку из функции.

      if(\File::exists($watermark_path))

Таким образом, самая простая функция, не зависящая от фреймворка:

function watermarkPhoto($originalFilePath, $filePath2Save ){

$watermark_path='photos/watermark.png';
$watermarkImg=Image::make($watermark_path);
$img=Image::make($originalFilePath);
$wmarkWidth=$watermarkImg->width();
$wmarkHeight=$watermarkImg->height();

$imgWidth=$img->width();
$imgHeight=$img->height();

$x=0;
$y=0;
while($y<=$imgHeight){
$img->insert($watermark_path,'top-left',$x,$y);
$x+=$wmarkWidth;
if($x>=$imgWidth){
$x=0;
$y+=$wmarkHeight;
}
}
$img->save($filePath2Save);

$watermarkImg->destroy();
$img->destroy();

return $filePath2Save;
}

Также вам нужно изображение водяного знака в формате png с прозрачным фоном.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]