Last article describe the basic logic of Convolution Matrix, it's used to apply Blur effect on Bitmap.
- The Kernal used for blur is:
{1, 1, 1
1, 1, 1
1, 1, 1}
- There are 9 '1' in the Kernal, so we have to divid the sum of each pixel by 9, to make it in the save level.
- Each color is limited within the range of 0~255.
- To make the blur effect more obviously, the processingBitmap of blur is called 5 times.
package com.AndroidImageProcessing;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.ImageView;
public class AndroidImageProcessingActivity extends Activity {
final static int KERNAL_WIDTH = 3;
final static int KERNAL_HEIGHT = 3;
int[][] kernalBlur ={
{1, 1, 1},
{1, 1, 1},
{1, 1, 1}
};
int DIV_BY_9 = 9;
ImageView imageSource, imageAfter;
Bitmap bitmap_Source;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageSource = (ImageView)findViewById(R.id.imageSource);
imageAfter = (ImageView)findViewById(R.id.imageAfter);
bitmap_Source = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
Bitmap afterBlur = processingBitmap(bitmap_Source, kernalBlur);
afterBlur = processingBitmap(afterBlur, kernalBlur);
afterBlur = processingBitmap(afterBlur, kernalBlur);
afterBlur = processingBitmap(afterBlur, kernalBlur);
afterBlur = processingBitmap(afterBlur, kernalBlur);
imageAfter.setImageBitmap(afterBlur);
}
private Bitmap processingBitmap(Bitmap src, int[][] knl){
Bitmap dest = Bitmap.createBitmap(
src.getWidth(), src.getHeight(), src.getConfig());
int bmWidth = src.getWidth();
int bmHeight = src.getHeight();
int bmWidth_MINUS_2 = bmWidth - 2;
int bmHeight_MINUS_2 = bmHeight - 2;
for(int i = 1; i <= bmWidth_MINUS_2; i++){
for(int j = 1; j <= bmHeight_MINUS_2; j++){
//get the surround 3*3 pixel of current src[i][j] into a matrix subSrc[][]
int[][] subSrc = new int[KERNAL_WIDTH][KERNAL_HEIGHT];
for(int k = 0; k < KERNAL_WIDTH; k++){
for(int l = 0; l < KERNAL_HEIGHT; l++){
subSrc[k][l] = src.getPixel(i-1+k, j-1+l);
}
}
//subSum = subSrc[][] * knl[][]
int subSumA = 0;
int subSumR = 0;
int subSumG = 0;
int subSumB = 0;
for(int k = 0; k < KERNAL_WIDTH; k++){
for(int l = 0; l < KERNAL_HEIGHT; l++){
subSumA += Color.alpha(subSrc[k][l]) * knl[k][l];
subSumR += Color.red(subSrc[k][l]) * knl[k][l];
subSumG += Color.green(subSrc[k][l]) * knl[k][l];
subSumB += Color.blue(subSrc[k][l]) * knl[k][l];
}
}
subSumA = subSumA/DIV_BY_9;
subSumR = subSumR/DIV_BY_9;
subSumG = subSumG/DIV_BY_9;
subSumB = subSumB/DIV_BY_9;
if(subSumA<0){
subSumA = 0;
}else if(subSumA>255){
subSumA = 255;
}
if(subSumR<0){
subSumR = 0;
}else if(subSumR>255){
subSumR = 255;
}
if(subSumG<0){
subSumG = 0;
}else if(subSumG>255){
subSumG = 255;
}
if(subSumB<0){
subSumB = 0;
}else if(subSumB>255){
subSumB = 255;
}
dest.setPixel(i, j, Color.argb(
subSumA,
subSumR,
subSumG,
subSumB));
}
}
return dest;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Original" />
<ImageView
android:id="@+id/imageSource"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Result" />
<ImageView
android:id="@+id/imageAfter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
Related:
- Sharpen image, using Convolution Matrix
0 Response to "Apply Blur effect on Android, using Convolution Matrix"
Posting Komentar