PHP/GD:更好的高斯模糊

发布于 2024-12-01 21:31:06 字数 454 浏览 4 评论 0 原文

我想用 GD 库模糊图像,不幸的是 GD 提供的 GAUSSIAN_BLUR 效果还不够,我想要更模糊的东西,

<?php $im = imagecreatefrompng($_GET['image']);
if($im && imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR))
{
  header('Content-Type: image/png');
    imagepng($im);
}
else
{
    echo 'fail';
}

imagedestroy($im);

我想要这样的东西或至少接近它。 图片来自 //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

I want to blur an image with GD library, unfortunately the GAUSSIAN_BLUR effect that GD gives isn't enough and i want something being more blurrish

<?php $im = imagecreatefrompng($_GET['image']);
if($im && imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR))
{
  header('Content-Type: image/png');
    imagepng($im);
}
else
{
    echo 'fail';
}

imagedestroy($im);

I want something like this or at least near it.
image from //tutorial9.s3.amazonaws.com/uploads/2008/06/lens-blur.jpg

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

浸婚纱 2024-12-08 21:31:06

遇到同样的问题后,我应用了相同的过滤器几次,每次都应用到先前“imagefilter”调用的结果资源。我得到了您正在寻找的“更模糊”效果。

例如:

for ($x=1; $x<=15; $x++)
   imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);

After coming across the same problem, I applied the same filter a few times, and each time to the resulting resource of the previous "imagefilter" call. I got the 'more blurry' effect you're looking for.

e.g.:

for ($x=1; $x<=15; $x++)
   imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
荭秂 2024-12-08 21:31:06

您可以尝试卷积:

$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($image, $gaussian, 16, 0);

$gaussian 是一个矩阵,因此从数学上讲,

[[1, 2, 1],
 [2, 4, 2],
 [1, 2, 1]]

您可以在以下位置找到其他卷积滤波器:http://aishack.in/tutorials/image-volving-examples/

imageconvolution( <image element>, <convolution matrix>, <divisor (sum of convolution matrix)>, <color offset>);

所以从上面的代码1+2+1+2+4+2+1+2+1 = 16 矩阵之和。 http://www.php.net/manual/en/function。 image卷积.php#97921 是一个获取
除数之和。

查看 http://php.net/manual/en/function.imagevolvo.php< /a> 有关此功能的更多信息。

好的时尚模糊是 (1,2,1),(2,1,2),(1,2,1)

编辑:
如下所述,您可以对结果输出多次运行任何过滤器,以增强效果。

You can try convolution:

$gaussian = array(array(1.0, 2.0, 1.0), array(2.0, 4.0, 2.0), array(1.0, 2.0, 1.0));
imageconvolution($image, $gaussian, 16, 0);

$gaussian is a matrix, so mathematically it's

[[1, 2, 1],
 [2, 4, 2],
 [1, 2, 1]]

you can find other convolution filters at: http://aishack.in/tutorials/image-convolution-examples/

imageconvolution( <image element>, <convolution matrix>, <divisor (sum of convolution matrix)>, <color offset>);

so from the code above 1+2+1+2+4+2+1+2+1 = 16 the sum of the matrix. http://www.php.net/manual/en/function.imageconvolution.php#97921 is a neat trick for getting the
sum of the divisor.

check out http://php.net/manual/en/function.imageconvolution.php for more info on this function.

good ol' fashion blur is (1,2,1),(2,1,2),(1,2,1)

EDIT:
as stated below you can run any filter more than once on the resulting output to also enhance the effect.

梦在夏天 2024-12-08 21:31:06

试试这个:

<?php
//
//fastblur function from image hosting and processing site http://hero-in.com
//

function blur($img, $radius=10)
{

if ($radius>100) $radius=100; //max radius
if ($radius<0) $radius=0; //nin radius

$radius=$radius*4;
$alphaStep=round(100/$radius)*1.7;
$width=imagesx($img);
$height=imagesy($img);
$beginX=floor($radius/2);
$beginY=floor($radius/2);


//make clean imahe sample for multiply
$cleanImageSample=imagecreatetruecolor($width, $height);
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);


//make h blur
for($i = 1; $i < $radius+1; $i++)
{
$xPoint=($beginX*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, $xPoint, 0, 0, 0, $width, $height, $alphaStep);
}
//make v blur
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);
for($i = 1; $i < $radius+1; $i++)
{
$yPoint=($beginY*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, 0, $yPoint, 0, 0, $width, $height, $alphaStep);
}
//finish
return $img;
imagedestroy($cleanImageSample); 
}

//example
$im = ImageCreateFromJpeg('image.jpg');
$im = blur($im,10);
imagejpeg($im)
imagedestroy($im);
?>

try this:

<?php
//
//fastblur function from image hosting and processing site http://hero-in.com
//

function blur($img, $radius=10)
{

if ($radius>100) $radius=100; //max radius
if ($radius<0) $radius=0; //nin radius

$radius=$radius*4;
$alphaStep=round(100/$radius)*1.7;
$width=imagesx($img);
$height=imagesy($img);
$beginX=floor($radius/2);
$beginY=floor($radius/2);


//make clean imahe sample for multiply
$cleanImageSample=imagecreatetruecolor($width, $height);
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);


//make h blur
for($i = 1; $i < $radius+1; $i++)
{
$xPoint=($beginX*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, $xPoint, 0, 0, 0, $width, $height, $alphaStep);
}
//make v blur
imagecopy($cleanImageSample, $img, 0, 0, 0, 0, $width, $height);
for($i = 1; $i < $radius+1; $i++)
{
$yPoint=($beginY*-1)+$i-1;
imagecopymerge($img, $cleanImageSample, 0, $yPoint, 0, 0, $width, $height, $alphaStep);
}
//finish
return $img;
imagedestroy($cleanImageSample); 
}

//example
$im = ImageCreateFromJpeg('image.jpg');
$im = blur($im,10);
imagejpeg($im)
imagedestroy($im);
?>
GRAY°灰色天空 2024-12-08 21:31:06

我基于 this 解决方案:

    for ($i = 0; $i < 25; $i++) {
        if ($i % 10 == 0) {//each 10th time apply 'IMG_FILTER_SMOOTH' with 'level of smoothness' set to -7
            imagefilter($tmp_dst_image, IMG_FILTER_SMOOTH, -7);
        }
        imagefilter($tmp_dst_image, IMG_FILTER_GAUSSIAN_BLUR);
    }

当您在多次模糊后应用平滑时,它会提供非常好的模糊效果。您可以在代码中尝试使用以下数字:25, 10, -7

另请参阅: 如何测量用 PHP 编写的代码的速度

I have very good result with following code based on this solution:

    for ($i = 0; $i < 25; $i++) {
        if ($i % 10 == 0) {//each 10th time apply 'IMG_FILTER_SMOOTH' with 'level of smoothness' set to -7
            imagefilter($tmp_dst_image, IMG_FILTER_SMOOTH, -7);
        }
        imagefilter($tmp_dst_image, IMG_FILTER_GAUSSIAN_BLUR);
    }

When you apply smooth after several blurs it delivers very good blurry effect. You can experiment with the following number in the code: 25, 10, -7.

See also: How to measure the speed of code written in PHP

霓裳挽歌倾城醉 2024-12-08 21:31:06

不确定 imagefilter 参数是否有帮助,但请检查一下。

或者,只需将图像过滤器应用于其结果几次???

Not sure if the imagefilter arguments help but check them out.

Alternatively, simply apply the image filter to it's result a couple of times???

心意如水 2024-12-08 21:31:06

为了获得更好的速度,请使用 https://www.php.net/manual/ tr/function.imagick-gaussianblurimage.php

注意:您需要安装 Imagick php 扩展(按照 此处

例子

header('Content-type: image/jpeg');
$image = new Imagick('https://i.dr.com.tr/cache/600x600-0/originals/0000000671636-1.jpg');

// Use gaussianBlurImage function 
$image->gaussianBlurImage(7, 5);

// Display the output image 
echo $image;

For better speed use https://www.php.net/manual/tr/function.imagick-gaussianblurimage.php

Note: You need to install Imagick php extention (follow install instructions from here

example

header('Content-type: image/jpeg');
$image = new Imagick('https://i.dr.com.tr/cache/600x600-0/originals/0000000671636-1.jpg');

// Use gaussianBlurImage function 
$image->gaussianBlurImage(7, 5);

// Display the output image 
echo $image;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文