下图是软件运行的截图:
本文只做了图像的打开和简单处理算法(图像的变亮、中值滤波、平滑滤波)的功能。其中,当软件运行时,首先调用软件内的lenna图像,显示在ImageView上。用户也可以选择媒体库中的图像。点击选择算法按钮,选择相应的处理算法(目前仅有3种),然后进行处理。图像处理的所有算法实现均由ImageProcess类管理。SystemMain.java是系统的主函数,负责调用其他Activity等。SelectAlgActivity.java是显示算法列表的,供用户选择。转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7852999
SystemMain.java
package com.example.njupt.zhb.imageprocesssystem;
import java.io.File;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class SystemMain extends Activity {
private Button selectImgBtn;
private Button selectAlgBtn;
private Button aboutBtn;
private TextView filepathView;
private TextView aboutView;
private OnClickListener seleImgBtnListener=null;
private OnClickListener seleAlgBtnListener=null;
private OnClickListener aboutBtnListener=null;
private static int RESULT_LOAD_IMAGE = 123;
private String picturePath=null;
private Bitmap myBitmap;
private ImageView myImageView;
private ImageProcess myImageProcess=new ImageProcess();
private static final String DYNAMICACTION_Broadcast = "Broadcast.njupt.zhb.selectAlg";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("ImageProcessing Made by ZhengHaibo");
setContentView(R.layout.activity_system_main);
seleImgBtnListener= new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
};
seleAlgBtnListener=new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SystemMain.this,SelectAlgActivity.class);
startActivity(intent);
}
};
aboutBtnListener=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent(SystemMain.this,ActivityAbout.class);
startActivity(intent);
}
};
SetControl();
ShowImage(null);
}
private void SetControl(){
selectAlgBtn=(Button)findViewById(R.id.processBtn);
selectImgBtn=(Button)findViewById(R.id.SelectBtn);
aboutBtn=(Button)findViewById(R.id.AboutBtn);
filepathView=(TextView)findViewById(R.id.ImagePath);
aboutView=(TextView)findViewById(R.id.AboutTextView);
myImageView=(ImageView)findViewById(R.id.imageshow);
selectAlgBtn.setOnClickListener(seleAlgBtnListener);
selectImgBtn.setOnClickListener(seleImgBtnListener);
aboutBtn.setOnClickListener(aboutBtnListener);
IntentFilter filter_dynamic = new IntentFilter();
filter_dynamic.addAction(DYNAMICACTION_Broadcast);
registerReceiver(dynamicReceiver, filter_dynamic);
}
// 2 自定义动态广播接收器,内部类,接收选择的算法
private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(DYNAMICACTION_Broadcast)){
Toast.makeText(SystemMain.this, "Please wait ...", Toast.LENGTH_SHORT).show();
String seleFlag = intent.getStringExtra("selectFlag");
int ch=Integer.parseInt(seleFlag);
switch(ch){
case 0:
ShowImage(myImageProcess.brighten(10, myBitmap));
break;
case 1:
ShowImage(myImageProcess.averageFilter(3,3,myBitmap));
break;
case 2:
ShowImage(myImageProcess.averageFilter(3,3,myBitmap));
break;
default:
Toast.makeText(SystemMain.this, "Wrong!", Toast.LENGTH_SHORT).show();
break;
}
Toast.makeText(SystemMain.this, "Processing finished!", Toast.LENGTH_SHORT).show();
}
}
};
private Bitmap FilesToBitmap(String filename){
Bitmap temp=null;
if(filename!=null){
File imageFile = new File(filename);
if (imageFile.exists())
{
// Load the image from file
temp = BitmapFactory.decodeFile(filename);
}
}
return temp;
}
public void ShowImage(Bitmap bitmap){
if (bitmap!=null) {
myImageView.setImageBitmap(bitmap);
}
else {
bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.lenna);
myImageView.setImageBitmap(bitmap);
myBitmap=bitmap;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
picturePath = cursor.getString(columnIndex);
cursor.close();
filepathView.setText(picturePath);
//imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
myBitmap=FilesToBitmap(picturePath);
ShowImage(myBitmap);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_system_main, menu);
return true;
}
}
SelectAlgActivity.java
package com.example.njupt.zhb.imageprocesssystem;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
public class SelectAlgActivity extends Activity implements OnItemClickListener{
private static final String DYNAMICACTION_Broadcast = "Broadcast.njupt.zhb.selectAlg";
private ListView listView;
public void sendFlagToActivity(String flag){
Intent intent = new Intent();
intent.setAction(DYNAMICACTION_Broadcast);
intent.putExtra("selectFlag", flag);
sendBroadcast(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Choose Image processing type!");
listView = new ListView(this);
List<String> list=getData();
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);
listView.setAdapter(adapter);
setContentView(listView);
listView.setOnItemClickListener(this);//绑定监听接口
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("图像变亮");
data.add("中值滤波");
data.add("平滑滤波");
return data;
}
/*实现OnItemClickListener接口*/
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
//finish();
String posString=Integer.toString(position);
sendFlagToActivity(posString);
finish();
}
}
ImageProcess.java
package com.example.njupt.zhb.imageprocesssystem;
import android.graphics.Bitmap;
public class ImageProcess {
public ImageProcess() {
// TODO Auto-generated constructor stub
}
public Bitmap brighten(int brightenOffset,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pix = new int[width * height];
myBitmap.getPixels(pix, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int index = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
int r = (pix[index] >> 16) & 0xff;
int g = (pix[index] >> 8) & 0xff;
int b = pix[index] & 0xff;
r = Math.max(0, Math.min(255, r + brightenOffset));
g = Math.max(0, Math.min(255, g + brightenOffset));
b = Math.max(0, Math.min(255, b + brightenOffset));
pix[index] = 0xff000000 | (r << 16) | (g << 8) | b;
index++;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pix, 0, width, 0, 0, width, height);
myBitmap = null;
pix = null;
return bitmap;
}
// filterWidth and filterHeight must be odd numbers
public Bitmap averageFilter(int filterWidth, int filterHeight,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pixNew = new int[width * height];
int[] pixOld = new int[width * height];
myBitmap.getPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap.getPixels(pixOld, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int filterHalfWidth = filterWidth/2;
int filterHalfHeight = filterHeight/2;
int filterArea = filterWidth * filterHeight;
for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
{
for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
{
// Accumulate values in neighborhood
int accumR = 0, accumG = 0, accumB = 0;
for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
{
for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
{
int index = (y+dy)*width + (x+dx);
accumR += (pixOld[index] >> 16) & 0xff;
accumG += (pixOld[index] >> 8) & 0xff;
accumB += pixOld[index] & 0xff;
} // dx
} // dy
// Normalize
accumR /= filterArea;
accumG /= filterArea;
accumB /= filterArea;
int index = y*width + x;
pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap = null;
pixOld = null;
pixNew = null;
return bitmap;
}
// filterWidth and filterHeight must be odd numbers
public Bitmap medianFilter(int filterWidth, int filterHeight,Bitmap myBitmap)
{
// Create new array
int width = myBitmap.getWidth();
int height = myBitmap.getHeight();
int[] pixNew = new int[width * height];
int[] pixOld = new int[width * height];
myBitmap.getPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap.getPixels(pixOld, 0, width, 0, 0, width, height);
// Apply pixel-by-pixel change
int filterHalfWidth = filterWidth/2;
int filterHalfHeight = filterHeight/2;
int filterArea = filterWidth * filterHeight;
for (int y = filterHalfHeight; y < height-filterHalfHeight; y++)
{
for (int x = filterHalfWidth; x < width-filterHalfWidth; x++)
{
// Accumulate values in neighborhood
int accumR = 0, accumG = 0, accumB = 0;
for (int dy = -filterHalfHeight; dy <= filterHalfHeight; dy++)
{
for (int dx = -filterHalfWidth; dx <= filterHalfWidth; dx++)
{
int index = (y+dy)*width + (x+dx);
accumR += (pixOld[index] >> 16) & 0xff;
accumG += (pixOld[index] >> 8) & 0xff;
accumB += pixOld[index] & 0xff;
} // dx
} // dy
// Normalize
accumR /= filterArea;
accumG /= filterArea;
accumB /= filterArea;
int index = y*width + x;
pixNew[index] = 0xff000000 | (accumR << 16) | (accumG << 8) | accumB;
} // x
} // y
// Change bitmap to use new array
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pixNew, 0, width, 0, 0, width, height);
myBitmap = null;
pixOld = null;
pixNew = null;
return bitmap;
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget38"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/ImagePath"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ImageProcess" />
<Button
android:id="@+id/SelectBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Select Image" />
<Button
android:id="@+id/processBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Select Image Pcocessing Algorithm" />
<ImageView
android:id="@+id/imageshow"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/AboutBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="About author" />
<TextView
android:id="@+id/AboutTextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="zhb931706659@126.com njupt zhb" />
</LinearLayout>