unknown os platform
How to add blur effect to background image in Android programmatically | Whats-online.info
whats-online-info

How to add blur effect to background image in Android programmatically


How
2017/02/22 / Science and Tutorials

Android tutorial, Learn how to add blur image effect to background image programmatically. See an example.





Android example: How to blur background image in android programmatically


Most time, programmers spent a lot of time trying to figure out how they can feature an image with a blurred background in android programmatically. Exactly this is what this tutorial features.



First and foremost, we need to understand this.
Blurring the background of an image in android means we need to have two image layers. A foreground image and background image. Then we add a blur effect to the background image and finally merge the two image layers together.

Let us code. We will create a simple project to demonstrate this post. For the newbie to android programming, follow this tutorial.

We will use our default MainActivity.java and activity_main.xml to demonstrate this tutorial.

activity_main.xml


Contains the following widgets
ImageView - Display our final blurred image
SeekBar - Vary the intensity of the blur effect

Entire activity_main.xml source code

<?xml version="1.0" encoding="utf-8"?> <LinearLayout     android:orientation="vertical"     xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     tools:context=".MainActivity">     <ImageView         android:id="@+id/imageView"         android:layout_width="wrap_content"         android:layout_height="400dp"         android:src="@drawable/bf"       />          <SeekBar         android:id="@+id/seekBar"         android:layout_width="match_parent"         android:layout_height="wrap_content" />      </LinearLayout>


MainActivity.java,

Has a method for adding blur effects to our image. The method creates a blurring effect to the image passed as Bitmap and returns a bitmap data type. We need first to convert our image background to bitmap
and pass it to the function fastblur()  to add the blur effects.

Finally, we will call our function inside the seekBar function for which we will pass an integer to the function to vary the intensity of the effect on seekBar change.

Entire MainActivity.java, Source Code

package info.whats_online.pipdemo; import android.graphics.BitmapFactory; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.graphics.Bitmap; import android.util.Log; import android.widget.ImageView; import android.widget.SeekBar; /**  * Licensed to http://www.whats-online.info**  */ public class MainActivity extends AppCompatActivity {     private ImageView bgImage;     private SeekBar seekBarBlur;     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         seekBarBlur= (SeekBar) findViewById(R.id.seekBar);         bgImage= (ImageView) findViewById(R.id.imageView);         Bitmap bg = BitmapFactory.decodeResource(getResources(), R.drawable.bf);         Bitmap blurred = fastblur(bg, 1, 10);//second parametre is radius         bgImage.setImageBitmap(blurred);         initBlurEffect();     }     private void initBlurEffect() {         seekBarBlur.setMax(100);         seekBarBlur.setKeyProgressIncrement(1);         seekBarBlur.setProgress(10);         seekBarBlur.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {             @Override             public void onProgressChanged(SeekBar seekBar, int i, boolean b) {                 bgImage.setImageResource(R.drawable.bf);                 bgImage.setDrawingCacheEnabled(true);                 Bitmap bitmap = bgImage.getDrawingCache();                 if (i == 0) {                     bgImage.setImageResource(R.drawable.bf);                 } else {                     Log.e("seek......", i + "");                     Bitmap blurred = fastblur(bitmap, 1, i);//second parametre is radius                     bgImage.setImageBitmap(blurred);                     bgImage.invalidate();                 }             }             @Override             public void onStartTrackingTouch(SeekBar seekBar) {             }             @Override             public void onStopTrackingTouch(SeekBar seekBar) {             }         });     }     public Bitmap fastblur(Bitmap sentBitmap, float scale, int radius) {         int width = Math.round(sentBitmap.getWidth() * scale);         int height = Math.round(sentBitmap.getHeight() * scale);         sentBitmap = Bitmap.createScaledBitmap(sentBitmap, width, height, false);         Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);         if (radius < 1) { return (null); } int w = bitmap.getWidth(); int h = bitmap.getHeight(); int[] pix = new int[w * h]; Log.e("pix", w + " " + h + " " + pix.length); bitmap.getPixels(pix, 0, w, 0, 0, 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) >> 1;         divsum *= divsum;         int dv[] = new int[256 * divsum];         for (i = 0; i < 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;         for (y = 0; y < h; y++) {             rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;             for (i = -radius; i <= radius; i++) { p = pix[yi + Math.min(wm, Math.max(i, 0))]; sir = stack[i + radius]; sir[0] = (p & 0xff0000) >> 16;                 sir[1] = (p & 0x00ff00) >> 8;                 sir[2] = (p & 0x0000ff);                 rbs = r1 - Math.abs(i);                 rsum += sir[0] * rbs;                 gsum += sir[1] * rbs;                 bsum += sir[2] * rbs;                 if (i > 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 < 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 & 0xff0000) >> 16;                 sir[1] = (p & 0x00ff00) >> 8;                 sir[2] = (p & 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;         }         for (x = 0; x < w; x++) {             rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;             yp = -radius * w;             for (i = -radius; i <= 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 > 0) {                 rinsum += sir[0];                 ginsum += sir[1];                 binsum += sir[2];             } else {                 routsum += sir[0];                 goutsum += sir[1];                 boutsum += sir[2];             }                 if (i < hm) {                     yp += w;                 }             }             yi = x;             stackpointer = radius;             for (y = 0; y < h; y++) {                 // Preserve alpha channel: ( 0xff000000 & pix[yi] )                 pix[yi] = ( 0xff000000 & pix[yi] ) | ( dv[rsum] << 16 ) | ( dv[gsum] << 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;             }         }         Log.e("pix", w + " " + h + " " + pix.length);         bitmap.setPixels(pix, 0, w, 0, 0, w, h);         return (bitmap);     } }

Thanks for your time. Like us below on Facebook and subscribe to our newsletter to get the latest updates direct to your mailbox. 

Download Source Code












You may also like:


Leave a comment












Subscribe to get replies direct to your mailbox

Submit comment