Blur an image
suggest changeThis example demonstrates how to use Renderscript API to blur an image (using Bitmap). This example uses ScriptInstrinsicBlur provided by android Renderscript API (API >= 17).
public class BlurProcessor { private RenderScript rs; private Allocation inAllocation; private Allocation outAllocation; private int width; private int height; private ScriptIntrinsicBlur blurScript; public BlurProcessor(RenderScript rs) { this.rs = rs; } public void initialize(int width, int height) { blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); blurScript.setRadius(7f); // Set blur radius. 25 is max if (outAllocation != null) { outAllocation.destroy(); outAllocation = null; } // Bitmap must have ARGB_8888 config for this type Type bitmapType = new Type.Builder(rs, Element.RGBA_8888(rs)) .setX(width) .setY(height) .setMipmaps(false) // We are using MipmapControl.MIPMAP_NONE .create(); // Create output allocation outAllocation = Allocation.createTyped(rs, bitmapType); // Create input allocation with same type as output allocation inAllocation = Allocation.createTyped(rs, bitmapType); } public void release() { if (blurScript != null) { blurScript.destroy(); blurScript = null; } if (inAllocation != null) { inAllocation.destroy(); inAllocation = null; } if (outAllocation != null) { outAllocation.destroy(); outAllocation = null; } } public Bitmap process(Bitmap bitmap, boolean createNewBitmap) { if (bitmap.getWidth() != width || bitmap.getHeight() != height) { // Throw error if required return null; } // Copy data from bitmap to input allocations inAllocation.copyFrom(bitmap); // Set input for blur script blurScript.setInput(inAllocation); // process and set data to the output allocation blurScript.forEach(outAllocation); if (createNewBitmap) { Bitmap returnVal = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); outAllocation.copyTo(returnVal); return returnVal; } outAllocation.copyTo(bitmap); return bitmap; } }
Each script has a kernel which processes the data and it is generally invoked via forEach
method.
public class BlurActivity extends AppCompatActivity { private BlurProcessor blurProcessor; @Override public void onCreate(Bundle savedInstanceState) { // setup layout and other stuff blurProcessor = new BlurProcessor(Renderscript.create(getApplicationContext())); } private void loadImage(String path) { // Load image to bitmap Bitmap bitmap = loadBitmapFromPath(path); // Initialize processor for this bitmap blurProcessor.release(); blurProcessor.initialize(bitmap.getWidth(), bitmap.getHeight()); // Blur image Bitmap blurImage = blurProcessor.process(bitmap, true); // Use newBitamp as false if you don't want to create a new bitmap } }
This concluded the example here. It is advised to do the processing in a background thread.
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents