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

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

 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);

«Образы»


person danial dezfooli    schedule 13.03.2017    source источник
comment
Возможно, попробуйте свертку: stackoverflow.com/a/7245782/1363190   -  person Michael Krikorev    schedule 13.03.2017
comment
Возможный дубликат PHP/GD: лучшее размытие по Гауссу   -  person Michael Krikorev    schedule 13.03.2017
comment
@MichaelK спасибо, но этого недостаточно   -  person danial dezfooli    schedule 13.03.2017
comment
Хорошо, я написал ответ с предложенным решением. Надеюсь, это сработает для вас.   -  person Michael Krikorev    schedule 13.03.2017


Ответы (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++){, вы получите большее размытие.

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

person Michael Krikorev    schedule 13.03.2017

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

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);
person Mehul Velani    schedule 13.07.2018

Примечание к шагам IMG_FILTER_SMOOTH в ответе Майкла К.:

imagefilter($sm, IMG_FILTER_SMOOTH,99);

Согласно PHP:imagefilter

IMG_FILTER_SMOOTH Применяет матрицу свертки с 9 ячейками, где центральный пиксель имеет вес arg1, а вес остальных равен 1,0. Результат нормализуется путем деления суммы на arg1 + 8.0 (сумма матрицы). принимается любое число с плавающей запятой, большое значение (на практике: 2048 и более) = без изменений

Таким образом, arg1 в imagefilter() взвешивает центральный пиксель ядра 3x3 по отношению к другим пикселям. Значение 99 ничего не изменит и его можно пропустить. Для большего размытия вы хотите использовать небольшой arg1 (ниже 8).

person sanguinarium    schedule 29.03.2021

легкий

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

$image = imagescale($image , $YOU_IMG_WIDTH/40, $YOU_IMG_WIDTH/40);
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
$image = imagescale($image , $YOU_IMG_WIDTH, $YOU_IMG_HEIGHT);

imagejpeg($image);
imagedestroy($image);
person Валентин Варапаев    schedule 28.07.2020