Как применить фильтр размытия к отдельному элементу, а не ко всему изображению - PullRequest
0 голосов
/ 06 мая 2020

У меня есть фотография (изображение), в ней я хочу добавить прямоугольник или квадрат белого цвета и только этот элемент с фильтром размытия, я использую GD, и все в порядке, но я не могу вставить размытие только в элементе, если я помещаю переменную $ img, все изображение имеет эффект размытия.

Я создал переменную $ rectangle, но если я использую ее в функции, она возвращает ошибку:

Warning: imagesx() expects parameter 1 to be resource, boolean given in...

Код:

$img = @imagecreatefrompng('test.png');
imagealphablending($img, true);
$size = 300;
$back = imagecolorallocatealpha($img, 255, 255, 255, 95);
$border = imagecolorallocatealpha($img, 255,255,255, 127);
imagefilledrectangle($img, 0, 1400, $size - 1, $size - 1, $back);
$rectangle = imagerectangle($img, 0, 1400, $size - 1, $size - 1, $border);
blur($rectangle, 3); //this returns the error.
// blur($img, 3); this makes the whole image have the effect not only the item, only the rectangle should have the effect

Это функция размытия:

function blur($item, $blurFactor = 3)
{
  // blurFactor has to be an integer
  $blurFactor = round($blurFactor);

  $originalWidth = imagesx($item);
  $originalHeight = imagesy($item);

  $smallestWidth = ceil($originalWidth * pow(0.5, $blurFactor));
  $smallestHeight = ceil($originalHeight * pow(0.5, $blurFactor));

  // for the first run, the previous image is the original input
  $prevImage = $item;
  $prevWidth = $originalWidth;
  $prevHeight = $originalHeight;

  // scale way down and gradually scale back up, blurring all the way
  for($i = 0; $i < $blurFactor; $i += 1)
  {   
    // determine dimensions of next image
    $nextWidth = $smallestWidth * pow(2, $i);
    $nextHeight = $smallestHeight * pow(2, $i);

    // resize previous image to next size
    $nextImage = imagecreatetruecolor($nextWidth, $nextHeight);
    imagecopyresized($nextImage, $prevImage, 0, 0, 0, 0,
      $nextWidth, $nextHeight, $prevWidth, $prevHeight);

    // apply blur filter
    imagefilter($nextImage, IMG_FILTER_GAUSSIAN_BLUR);

    // now the new image becomes the previous image for the next step
    $prevImage = $nextImage;
    $prevWidth = $nextWidth;
    $prevHeight = $nextHeight;
  }

  // scale back to original size and blur one more time
  imagecopyresized($item, $nextImage,
    0, 0, 0, 0, $originalWidth, $originalHeight, $nextWidth, $nextHeight);
  imagefilter($item, IMG_FILTER_GAUSSIAN_BLUR);

  // clean up
  imagedestroy($prevImage);

  // return result
  return $item;

}

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...