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.
VIDEO 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 the files.