Эффект размытия по-разному в PHP/GD

Мне нужно обфускать определенную область изображения с помощью PHP и GD, в настоящее время я использую следующий код:

for ($x = $_GET['x1']; $x < $_GET['x2']; $x += $pixel)
{
    for ($y = $_GET['y1']; $y < $_GET['y2']; $y += $pixel)
    {
        ImageFilledRectangle($image, $x, $y, $x + $pixel - 1, $y + $pixel - 1, ImageColorAt($image, $x, $y));
    }
}

Это в основном заменяет выбранную область квадратами пикселей в пикселях. Я хочу выполнить какой-то эффект размытия (гауссовский), я знаю, что могу использовать функцию ImageFilter():

ImageFilter($image, IMG_FILTER_GAUSSIAN_BLUR);

Но он размывает весь холст, моя проблема в том, что я просто хочу размыть определенную область.

Ответ 1

Вы можете скопировать определенную часть изображения в новое изображение, применить размытие на новом изображении и скопировать результат.

Пример:

$image2 = imagecreate($width, $height);
imagecopy  ( $image2  , $image  , 0  , 0  , $x  , $y  , $width  , $height);
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
imagecopy ($image, $image2, $x, $y, 0, 0, $width, $height);

Ответ 2

Я не проверял документацию для imagefilter, и я не знаю, возможно ли это, или если есть эквивалент применения этого (части) изображения. Но предполагая, что нет, почему бы и нет:

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