android 学习之图像处理系统(一)
源代码: android图像处理系统1.0

下图是软件运行的截图:


本文只做了图像的打开和简单处理算法(图像的变亮、中值滤波、平滑滤波)的功能。其中,当软件运行时,首先调用软件内的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() {@Overridepublic void onClick(View v) {Intent intent=new Intent(SystemMain.this,SelectAlgActivity.class);startActivity(intent);}};aboutBtnListener=new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent 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);}@Overridepublic 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接口*/@Overridepublic 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"?><LinearLayoutandroid: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"><TextViewandroid:id="@+id/ImagePath"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="ImageProcess" /><Buttonandroid:id="@+id/SelectBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Select Image" /><Buttonandroid:id="@+id/processBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="Select Image Pcocessing Algorithm" /><ImageViewandroid:id="@+id/imageshow"android:layout_width="fill_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/AboutBtn"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="About author" /><TextViewandroid:id="@+id/AboutTextView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="[email protected]  njupt zhb" /></LinearLayout>



更多相关文章

  1. GC机制,你真的了解吗?
  2. Android(安卓)Camera详解
  3. Vectors(2): 绘制优美的路径动画
  4. iOS,Android,WP, .NET通用AES加密算法
  5. Android文字基线(Baseline)算法
  6. android直播中的一些流媒体技术浅析
  7. Facebook开源项目:我们为什么要用Fresco框架?
  8. Android五子棋算法简单实现
  9. 图像识别:Android中使用OpenCV

随机推荐

  1. Android中invalidate()和postInvalidate(
  2. QQ音乐Android客户端Web页面通用性能优化
  3. 【Android】自定义FlowLayout,支持多种布
  4. Android中水波纹使用之自定义视图实现
  5. Android(安卓)studio 单元测试初探
  6. 初学Android,使用自定义的XML资源(十八)
  7. 基于ARM Cortex-A8和Android 4.x的联动报
  8. Android进程管理及静态变量垃圾回收
  9. Android文档(三)-数据存储
  10. 低版本的android系统如何使用ActionBar