2

I am trying to blur an image and need a faster solution.

This is my current attempt which is much too slow for large images and I do not want to use imagick.

public function blur($filename, $extension, $factor = 20){
    if (strtolower($extension) === "jpg" || strtolower($extension) === "jpeg") $image = imagecreatefromjpeg($filename);
    if (strtolower($extension) === "png") $image = imagecreatefrompng($filename);

    for ($x=1; $x<=$factor; $x++)
       imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
    imagejpeg($image, "$filename.blur.$extension");
    imagedestroy($image);

}

Is there a PHP implementation of stackblur or another fast algorithm available?

3
  • You can use SimpleImage class. But afaik this class also uses the GD Lib and so this filter. Commented Nov 28, 2013 at 9:20
  • Well it might be a good approach. Will test this one out thanks. Commented Nov 28, 2013 at 9:21
  • 1
    Modern versions of PHP support various image manipulation libraries such as Cairo, GD, Gmagick and ImageMagick. You could try substitutiong one of those, but I doubt the performance would be hugely faster. You might want to consider handing the image generation off to a background job so the main job can complete sooner instead. Commented Nov 28, 2013 at 9:49

1 Answer 1

15

The simple solution is to scale the image down before you apply the blur filter. Here are some examples:

Original image:

Photo of a cat (public domain: Longhair_Tabby_JaJa.jpg from Wikimedia Commons)

20× Gaussian Blur (2.160 seconds):

{
  $start = microtime(true);
  for ($x=0; $x<20; $x++) {
    imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
  }
  $end =  microtime(true);
  $howlong = $end - $start;
}

Result of applying Gaussian blur filter 20 times

Combination of scaling and Gaussian blur (0.237 seconds):

{
  $start = microtime(true);

  /* Scale by 25% and apply Gaussian blur */
  $s_img1 = imagecreatetruecolor(160,120);
  imagecopyresampled($s_img1, $image, 0, 0, 0, 0, 160, 120, 640, 480);
  imagefilter($s_img1, IMG_FILTER_GAUSSIAN_BLUR);

  /* Scale result by 200% and blur again */
  $s_img2 = imagecreatetruecolor(320,240);
  imagecopyresampled($s_img2, $s_img1, 0, 0, 0, 0, 320, 240, 160, 120);
  imagedestroy($s_img1);
  imagefilter($s_img2, IMG_FILTER_GAUSSIAN_BLUR);

  /* Scale result back to original size and blur one more time */
  imagecopyresampled($image, $s_img2, 0, 0, 0, 0, 640, 480, 320, 240);
  imagedestroy($s_img2);
  imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
  $end =  microtime(true);
  $howlong = $end - $start;
}

Result of applying a combination of image scaling and Gaussian blur

Sign up to request clarification or add additional context in comments.

4 Comments

@GordonM I've found a better way of doing it — if the image is scaled back to its original size in stages, then it only needs one pass of the blur filter at each stage.
gaussian_blur will still take 5+ seconds for a single pass on large images (3000px by 2000px, for example). Seems canvas + stackblur algorithm is the only open source library solution to do this quickly (though I'm sure stackblur could be made in PHP I'm not smart enough to do it)

Your Answer

By clicking “Post Your Answer”, you agree to our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant