interactive exercise of ScriptIntrinsicConvolve3x3

Last example show how to "Sharpen and blur bitmap using ScriptIntrinsicConvolve3x3", here is a interactive exercise of ScriptIntrinsicConvolve3x3. You can adjust coefficients of ScriptIntrinsicConvolve3x3, and view the result.


package com.example.androidimageview;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicConvolve3x3;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

ImageView image1, image2;
SeekBar coeff0, coeff1, coeff2;
SeekBar coeff3, coeff4, coeff5;
SeekBar coeff6, coeff7, coeff8;
SeekBar devBy;
Button btnBlur, btnOrg, btnSharpen;

TextView textCoeff;

float[] matrix = {
0, 0, 0,
0, 1, 0,
0, 0, 0
};

Bitmap bitmapOriginal, bitmapCoeff;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

coeff0 = (SeekBar)findViewById(R.id.coeff0);
coeff1 = (SeekBar)findViewById(R.id.coeff1);
coeff2 = (SeekBar)findViewById(R.id.coeff2);
coeff3 = (SeekBar)findViewById(R.id.coeff3);
coeff4 = (SeekBar)findViewById(R.id.coeff4);
coeff5 = (SeekBar)findViewById(R.id.coeff5);
coeff6 = (SeekBar)findViewById(R.id.coeff6);
coeff7 = (SeekBar)findViewById(R.id.coeff7);
coeff8 = (SeekBar)findViewById(R.id.coeff8);
devBy = (SeekBar)findViewById(R.id.coeffdivby);
textCoeff = (TextView)findViewById(R.id.textcoeff);
btnBlur = (Button)findViewById(R.id.blur);
btnOrg = (Button)findViewById(R.id.org);
btnSharpen = (Button)findViewById(R.id.sharpen);
image1 = (ImageView) findViewById(R.id.image1);
image2 = (ImageView) findViewById(R.id.image2);

bitmapOriginal = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);

coeff0.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff1.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff2.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff3.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff4.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff5.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff6.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff7.setOnSeekBarChangeListener(OnCoeffChangeListener);
coeff8.setOnSeekBarChangeListener(OnCoeffChangeListener);
devBy.setOnSeekBarChangeListener(OnCoeffChangeListener);

ReloadImage();

btnBlur.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
coeff0.setProgress(1+10);
coeff1.setProgress(1+10);
coeff2.setProgress(1+10);
coeff3.setProgress(1+10);
coeff4.setProgress(1+10);
coeff5.setProgress(1+10);
coeff6.setProgress(1+10);
coeff7.setProgress(1+10);
coeff8.setProgress(1+10);
devBy.setProgress(9-1);
ReloadImage();
}});

btnOrg.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
coeff0.setProgress(0+10);
coeff1.setProgress(0+10);
coeff2.setProgress(0+10);
coeff3.setProgress(0+10);
coeff4.setProgress(1+10);
coeff5.setProgress(0+10);
coeff6.setProgress(0+10);
coeff7.setProgress(0+10);
coeff8.setProgress(0+10);
devBy.setProgress(1-1);
ReloadImage();
}});

btnSharpen.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
coeff0.setProgress(0+10);
coeff1.setProgress(-1+10);
coeff2.setProgress(0+10);
coeff3.setProgress(-1+10);
coeff4.setProgress(5+10);
coeff5.setProgress(-1+10);
coeff6.setProgress(0+10);
coeff7.setProgress(-1+10);
coeff8.setProgress(0+10);
devBy.setProgress(1-1);
ReloadImage();
}});
}

OnSeekBarChangeListener OnCoeffChangeListener = new OnSeekBarChangeListener(){

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
ReloadImage();
}};

private void ReloadImage(){
updateMatrix();
bitmapCoeff = createBitmap_convolve(bitmapOriginal, matrix);
image1.setImageBitmap(bitmapCoeff);
image2.setImageBitmap(bitmapCoeff);
}

private void updateMatrix(){
float div = devBy.getProgress() + 1;
matrix[0] = (coeff0.getProgress()-10)/div;
matrix[1] = (coeff1.getProgress()-10)/div;
matrix[2] = (coeff2.getProgress()-10)/div;
matrix[3] = (coeff3.getProgress()-10)/div;
matrix[4] = (coeff4.getProgress()-10)/div;
matrix[5] = (coeff5.getProgress()-10)/div;
matrix[6] = (coeff6.getProgress()-10)/div;
matrix[7] = (coeff7.getProgress()-10)/div;
matrix[8] = (coeff8.getProgress()-10)/div;

textCoeff.setText(
matrix[0] + " , " + matrix[1] + " , " + matrix[2] + " , \n" +
matrix[3] + " , " + matrix[4] + " , " + matrix[5] + " , \n" +
matrix[6] + " , " + matrix[7] + " , " + matrix[8]);
}

private Bitmap createBitmap_convolve(Bitmap src, float[] coefficients) {

Bitmap result = Bitmap.createBitmap(src.getWidth(),
src.getHeight(), src.getConfig());

RenderScript renderScript = RenderScript.create(this);

Allocation input = Allocation.createFromBitmap(renderScript, src);
Allocation output = Allocation.createFromBitmap(renderScript, result);

ScriptIntrinsicConvolve3x3 convolution = ScriptIntrinsicConvolve3x3
.create(renderScript, Element.U8_4(renderScript));
convolution.setInput(input);
convolution.setCoefficients(coefficients);
convolution.forEach(output);

output.copyTo(result);
renderScript.destroy();
return result;
}

}

<LinearLayout 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"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.androidimageview.MainActivity" >

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<SeekBar
android:id="@+id/coeff0"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />

<SeekBar
android:id="@+id/coeff1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />

<SeekBar
android:id="@+id/coeff2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<SeekBar
android:id="@+id/coeff3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />

<SeekBar
android:id="@+id/coeff4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="11" />

<SeekBar
android:id="@+id/coeff5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<SeekBar
android:id="@+id/coeff6"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />

<SeekBar
android:id="@+id/coeff7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />

<SeekBar
android:id="@+id/coeff8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:max="20"
android:progress="10" />
</LinearLayout>

<SeekBar
android:id="@+id/coeffdivby"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="19"
android:progress="0" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
android:id="@+id/blur"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Blur"/>
<Button
android:id="@+id/org"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Original"/>
<Button
android:id="@+id/sharpen"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Sharpen"/>

</LinearLayout>

<TextView
android:id="@+id/textcoeff"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<ImageView
android:id="@+id/image2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

</LinearLayout>



download filesDownload the files.