title: Android, Blur Bitmap instantly?
body: <p>So I'm trying to blur an image as fast as possible(instant feel like),
  as the activity needs to be updated as I press the Blur button.</p>
  
  <p>The problem I am having is that, I cannot find a Blur that works quick enough...
  <strong>Note: The blur, preferably a Gaussian blur, doesn't need to be the best quality at all..</strong></p>
  
  <p>I tried out the following, but it takes a few seconds, is there anyway this code could be made to run quicker in sacrifice of quality ? Or are there any other alternatives?
  I would look into GPU stuff, but this blur is really just an effect related to the UI and only happens when I press open a transparent activity sized as a small box...</p>
  
  <p>Any Ideas?</p>
  
  <pre><code>static Bitmap fastblur(Bitmap sentBitmap, int radius, int fromX, int fromY,
      int width, int height) {
  
  // Stack Blur v1.0 from
  // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
  //
  // Java Author: Mario Klingemann &lt;mario at quasimondo.com&gt;
  // http://incubator.quasimondo.com
  // created Feburary 29, 2004
  // Android port : Yahel Bouaziz &lt;yahel at kayenko.com&gt;
  // http://www.kayenko.com
  // ported april 5th, 2012
  
  // This is a compromise between Gaussian Blur and Box blur
  // It creates much better looking blurs than Box Blur, but is
  // 7x faster than my Gaussian Blur implementation.
  //
  // I called it Stack Blur because this describes best how this
  // filter works internally: it creates a kind of moving stack
  // of colors whilst scanning through the image. Thereby it
  // just has to add one new block of color to the right side
  // of the stack and remove the leftmost color. The remaining
  // colors on the topmost layer of the stack are either added on
  // or reduced by one, depending on if they are on the right or
  // on the left side of the stack.
  //
  // If you are using this algorithm in your code please add
  // the following line:
  //
  // Stack Blur Algorithm by Mario Klingemann &lt;mario@quasimondo.com&gt;
  
  Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
  
  if (radius &lt; 1) {
      return (null);
  }
  
  int w = width;
  int h = height;
  
  int[] pix = new int[w * h];
  
  bitmap.getPixels(pix, 0, w, fromX, fromY, w, h);
  
  int wm = w - 1;
  int hm = h - 1;
  int wh = w * h;
  int div = radius + radius + 1;
  
  int r[] = new int[wh];
  int g[] = new int[wh];
  int b[] = new int[wh];
  int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
  int vmin[] = new int[Math.max(w, h)];
  
  int divsum = (div + 1) &gt;&gt; 1;
  divsum *= divsum;
  int dv[] = new int[256 * divsum];
  for (i = 0; i &lt; 256 * divsum; i++) {
      dv[i] = (i / divsum);
  }
  
  yw = yi = 0;
  
  int[][] stack = new int[div][3];
  int stackpointer;
  int stackstart;
  int[] sir;
  int rbs;
  int r1 = radius + 1;
  int routsum, goutsum, boutsum;
  int rinsum, ginsum, binsum;
  
  int originRadius = radius;
  for (y = 0; y &lt; h; y++) {
      rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
      for (i = -radius; i &lt;= radius; i++) {
          p = pix[yi + Math.min(wm, Math.max(i, 0))];
          sir = stack[i + radius];
          sir[0] = (p &amp; 0xff0000) &gt;&gt; 16;
          sir[1] = (p &amp; 0x00ff00) &gt;&gt; 8;
          sir[2] = (p &amp; 0x0000ff);
          rbs = r1 - Math.abs(i);
          rsum += sir[0] * rbs;
          gsum += sir[1] * rbs;
          bsum += sir[2] * rbs;
          if (i &gt; 0) {
              rinsum += sir[0];
              ginsum += sir[1];
              binsum += sir[2];
          } else {
              routsum += sir[0];
              goutsum += sir[1];
              boutsum += sir[2];
          }
      }
      stackpointer = radius;
  
      for (x = 0; x &lt; w; x++) {
  
          r[yi] = dv[rsum];
          g[yi] = dv[gsum];
          b[yi] = dv[bsum];
  
          rsum -= routsum;
          gsum -= goutsum;
          bsum -= boutsum;
  
          stackstart = stackpointer - radius + div;
          sir = stack[stackstart % div];
  
          routsum -= sir[0];
          goutsum -= sir[1];
          boutsum -= sir[2];
  
          if (y == 0) {
              vmin[x] = Math.min(x + radius + 1, wm);
          }
          p = pix[yw + vmin[x]];
  
          sir[0] = (p &amp; 0xff0000) &gt;&gt; 16;
          sir[1] = (p &amp; 0x00ff00) &gt;&gt; 8;
          sir[2] = (p &amp; 0x0000ff);
  
          rinsum += sir[0];
          ginsum += sir[1];
          binsum += sir[2];
  
          rsum += rinsum;
          gsum += ginsum;
          bsum += binsum;
  
          stackpointer = (stackpointer + 1) % div;
          sir = stack[(stackpointer) % div];
  
          routsum += sir[0];
          goutsum += sir[1];
          boutsum += sir[2];
  
          rinsum -= sir[0];
          ginsum -= sir[1];
          binsum -= sir[2];
  
          yi++;
      }
      yw += w;
  }
  
  radius = originRadius;
  
  for (x = 0; x &lt; w; x++) {
      rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
      yp = -radius * w;
      for (i = -radius; i &lt;= radius; i++) {
          yi = Math.max(0, yp) + x;
  
          sir = stack[i + radius];
  
          sir[0] = r[yi];
          sir[1] = g[yi];
          sir[2] = b[yi];
  
          rbs = r1 - Math.abs(i);
  
          rsum += r[yi] * rbs;
          gsum += g[yi] * rbs;
          bsum += b[yi] * rbs;
  
          if (i &gt; 0) {
              rinsum += sir[0];
              ginsum += sir[1];
              binsum += sir[2];
          } else {
              routsum += sir[0];
              goutsum += sir[1];
              boutsum += sir[2];
          }
  
          if (i &lt; hm) {
              yp += w;
          }
      }
      yi = x;
      stackpointer = radius;
      for (y = 0; y &lt; h; y++) {
          pix[yi] = 0xff000000 | (dv[rsum] &lt;&lt; 16) | (dv[gsum] &lt;&lt; 8)
                  | dv[bsum];
  
          rsum -= routsum;
          gsum -= goutsum;
          bsum -= boutsum;
  
          stackstart = stackpointer - radius + div;
          sir = stack[stackstart % div];
  
          routsum -= sir[0];
          goutsum -= sir[1];
          boutsum -= sir[2];
  
          if (x == 0) {
              vmin[y] = Math.min(y + r1, hm) * w;
          }
          p = x + vmin[y];
  
          sir[0] = r[p];
          sir[1] = g[p];
          sir[2] = b[p];
  
          rinsum += sir[0];
          ginsum += sir[1];
          binsum += sir[2];
  
          rsum += rinsum;
          gsum += ginsum;
          bsum += binsum;
  
          stackpointer = (stackpointer + 1) % div;
          sir = stack[stackpointer];
  
          routsum += sir[0];
          goutsum += sir[1];
          boutsum += sir[2];
  
          rinsum -= sir[0];
          ginsum -= sir[1];
          binsum -= sir[2];
  
          yi += w;
      }
  }
  
  bitmap.setPixels(pix, 0, w, fromX, fromY, w, h);
  
  return (bitmap);
  </code></pre>
  
  <p>}</p>