package com.sqisland.android.graphics_demo;
import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import java.util.Arrays;
import java.util.List;
@TargetApi(17)
public class RenderscriptConvolutionActivity extends SpinnerImageActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
imageView.setBackgroundColor(Color.BLACK); // for edge detection
}
@Override
protected List<Option> getOptions(Bitmap original) {
return Arrays.asList(
new Option(getString(R.string.original), original),
createOption(original, R.string.sharpen, new float[] {
0, -1, 0,
-1, 5, -1,
0, -1, 0
}),
createOption(original, R.string.edge_detection, new float[] {
-1, -1, -1,
-1, 8, -1,
-1, -1, -1
}),
createOption(original, R.string.box_blur, new float[] {
1, 1, 1,
1, 1, 1,
1, 1, 1
}, 9),
createOption(original, R.string.fuzzy_glass, new float[] {
0, 20, 0,
20, -59, 20,
1, 13, 0
}, 7)
);
}
private Option createOption(Bitmap original, int titleId, float[] coefficients) {
return createOption(original, titleId, coefficients, 1);
}
private Option createOption(Bitmap original, int titleId, float[] coefficients, float divisor) {
if (divisor != 0 && divisor != 1) {
for (int i = 0; i < coefficients.length; ++i) {
coefficients[i] = coefficients[i] / divisor;
}
}
String title = getString(titleId);
Bitmap bitmap = convolve(original, coefficients);
return new Option(title, bitmap);
}
private Bitmap convolve(Bitmap original, float[] coefficients) {
Bitmap bitmap = Bitmap.createBitmap(
original.getWidth(), original.getHeight(),
Bitmap.Config.ARGB_8888);
RenderScript rs = RenderScript.create(this);
Allocation allocIn = Allocation.createFromBitmap(rs, original);
Allocation allocOut = Allocation.createFromBitmap(rs, bitmap);
ScriptIntrinsicConvolve3x3 convolution
= ScriptIntrinsicConvolve3x3.create(rs, Element.U8_4(rs));
convolution.setInput(allocIn);
convolution.setCoefficients(coefficients);
convolution.forEach(allocOut);
allocOut.copyTo(bitmap);
rs.destroy();
return bitmap;
}
}