/**
* StackBlur v1.0 for Android
*
* @Author: Enrique López Mañas <eenriquelopez@gmail.com>
* http://www.lopez-manas.com
* <p/>
* Author of the original algorithm: Mario Klingemann <mario.quasimondo.com>
* <p/>
* 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.
* <p/>
* 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.
* @copyright: Enrique López Mañas
* @license: Apache License 2.0
*/
package com.enrique.stackblur;
import android.content.Context;
import android.graphics.Bitmap;
import java.io.FileOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class StackBlurManager {
static final int EXECUTOR_THREADS = Runtime.getRuntime().availableProcessors();
static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(EXECUTOR_THREADS);
/**
* Original image
*/
private final Bitmap _image;
/**
* Most recent result of blurring
*/
private Bitmap _result;
/**
* Method of blurring
*/
private final BlurProcess _blurProcess;
/**
* Constructor method (basic initialization and construction of the pixel array)
*
* @param image The image that will be analyed
*/
public StackBlurManager(Bitmap image) {
_image = image;
_blurProcess = new JavaBlurProcess();
}
/**
* Process the image on the given radius. Radius must be at least 1
*
* @param radius
*/
public Bitmap process(int radius) {
_result = _blurProcess.blur(_image, radius);
return _result;
}
/**
* Returns the blurred image as a bitmap
*
* @return blurred image
*/
public Bitmap returnBlurredImage() {
return _result;
}
/**
* Save the image into the file system
*
* @param path The path where to save the image
*/
public void saveIntoFile(String path) {
try {
FileOutputStream out = new FileOutputStream(path);
_result.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Returns the original image as a bitmap
*
* @return the original bitmap image
*/
public Bitmap getImage() {
return this._image;
}
/**
* Process the image using a native library
*/
public Bitmap processNatively(int radius) {
throw new UnsupportedOperationException();
}
/**
* Process the image using renderscript if possible
* Fall back to native if renderscript is not available
*
* @param context renderscript requires an android context
* @param radius
*/
public Bitmap processRenderScript(Context context, float radius) {
throw new UnsupportedOperationException();
}
}