imagefilter — лучший способ размыть изображения

Я пытаюсь размыть первое изображение, как третье, но я не могу этого сделать! 🙁

 header('Content-Type: image/jpeg');
$image = imagecreatefromjpeg('1.jpg');
for ($x=1; $x<=40; $x++){
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR,999);
}
imagefilter($image, IMG_FILTER_SMOOTH,99);
imagefilter($image, IMG_FILTER_BRIGHTNESS, 10);
imagejpeg($image);
imagedestroy($image);

Изображения

4

Решение

Попробуйте уменьшить изображение и применить контур с размытием по Гауссу к измененному изображению. Таким образом вы сэкономите некоторую производительность на больших изображениях:

header('Content-Type: image/jpeg');
$file = '1.jpg';
$image = imagecreatefromjpeg($file);

/* Get original image size */
list($w, $h) = getimagesize($file);

/* Create array with width and height of down sized images */
$size = array('sm'=>array('w'=>intval($w/4), 'h'=>intval($h/4)),
'md'=>array('w'=>intval($w/2), 'h'=>intval($h/2))
);

/* Scale by 25% and apply Gaussian blur */
$sm = imagecreatetruecolor($size['sm']['w'],$size['sm']['h']);
imagecopyresampled($sm, $image, 0, 0, 0, 0, $size['sm']['w'], $size['sm']['h'], $w, $h);

for ($x=1; $x <=40; $x++){
imagefilter($sm, IMG_FILTER_GAUSSIAN_BLUR, 999);
}

imagefilter($sm, IMG_FILTER_SMOOTH,99);
imagefilter($sm, IMG_FILTER_BRIGHTNESS, 10);

/* Scale result by 200% and blur again */
$md = imagecreatetruecolor($size['md']['w'], $size['md']['h']);
imagecopyresampled($md, $sm, 0, 0, 0, 0, $size['md']['w'], $size['md']['h'], $size['sm']['w'], $size['sm']['h']);
imagedestroy($sm);

for ($x=1; $x <=25; $x++){
imagefilter($md, IMG_FILTER_GAUSSIAN_BLUR, 999);
}

imagefilter($md, IMG_FILTER_SMOOTH,99);
imagefilter($md, IMG_FILTER_BRIGHTNESS, 10);

/* Scale result back to original size */
imagecopyresampled($image, $md, 0, 0, 0, 0, $w, $h, $size['md']['w'], $size['md']['h']);
imagedestroy($md);

// Apply filters of upsized image if you wish, but probably not needed
//imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
//imagefilter($image, IMG_FILTER_SMOOTH,99);
//imagefilter($image, IMG_FILTER_BRIGHTNESS, 10);

imagejpeg($image);
imagedestroy($image);

Я позаимствовал идею сокращения и часть кода формирует этот ответ

Я проверил решение с вашим изображением, и результат:

введите описание изображения здесь

Вы можете разрабатывать и увеличивать / уменьшать размытие, изменяя количество петель для маленького изображения. Если вы измените for ($x=1; $x <=40; $x++){ в for ($x=1; $x <=75; $x++){ вы получите больше размытия.

Недостатком этого решения является то, что вы получите некоторую видимую пикселизацию из-за происходящего изменения размера. Положительным моментом является лучшая производительность, меньшая нагрузка на сервер и время выполнения по сравнению с тем, если бы вы применили цикл размытия к исходному размеру изображения.

8

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

Я также столкнулся с этой проблемой в своем проекте в то время, когда я использовал какой-то длинный код, но я думаю, что этот код не является правильным и создаю свой собственный небольшой код, вот этот код

header("content-type: image/png");
$image = imagecreatefromjpeg("abc.jpg");
for ($x=1; $x<=50; $x++)
{
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
}
imagepng($image);
imagedestroy($image);
2

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