package at.favre.lib.dali.builder.processor; import android.graphics.Bitmap; import android.support.v8.renderscript.Allocation; import android.support.v8.renderscript.Element; import android.support.v8.renderscript.RenderScript; import android.support.v8.renderscript.ScriptIntrinsicConvolve3x3; /** * This will change the brightness of a bitmap. It utilizes * a convolve matrix algorithm powered by renderscript (=native and fast) * * Brightness values are from -100 (black) to 1000 and more */ public class BrightnessProcessor implements IBitmapProcessor { private RenderScript rs; private float brightness; public BrightnessProcessor(RenderScript rs, float brightness) { this.rs = rs; this.brightness = brightness; } @Override public Bitmap manipulate(Bitmap bitmapOriginal) { if(brightness != 0) { Allocation input = Allocation.createFromBitmap(rs, bitmapOriginal); final Allocation output = Allocation.createTyped(rs, input.getType()); final ScriptIntrinsicConvolve3x3 script = ScriptIntrinsicConvolve3x3.create(rs, Element.U8_4(rs)); script.setCoefficients(createBrightnessKernel2(brightness)); script.setInput(input); script.forEach(output); output.copyTo(bitmapOriginal); } return bitmapOriginal; } @Override public String getProcessorTag() { return this.getClass().getSimpleName()+": "+brightness; } private float[] createBrightnessKernel(float brightness) { float kernelElement; if(brightness < 0 ) { kernelElement = 1f- Math.abs(brightness) / 100f; } else { kernelElement = 1f + Math.abs(brightness) / 100f; } kernelElement = Math.max(Math.min(100,kernelElement),0); // normalize to max/min values float [] brightnessKernel = new float[9]; for (int i = 0; i < 9; i++) { if(i == 4) { brightnessKernel[i] = kernelElement; } else { brightnessKernel[i] = 0; } } return brightnessKernel; } private float[] createBrightnessKernel2(float brightness) { float kernelElement = 1.f / 9.f; //get average kernelElement += kernelElement * (brightness / 100.f); //add or subtract from the average to brighten or darken kernelElement = Math.max(Math.min(1,kernelElement),0); // normalize to max/min values float [] brightnessKernel = new float[9]; for (int i = 0; i < 9; i++) { brightnessKernel[i] = kernelElement; } return brightnessKernel; } }