カメラで撮った画像を白黒にするメソッド


撮影した画像のパスは、Uriで管理します。

[MainActivity]

SetImages(uri);

private void SetImages(Uri uri) {
	//まずは画像がちゃんと存在するかをチェック
	boolean exist = ComnUtil.CheckExistImage(MainActivity.this, uri);
	
	if (exist) {
		//画像処理開始
		ProgressDialog mProgress =null;
		Handler mHandler = new Handler();
		
        mProgress = new ProgressDialog(this);  
        mProgress.setMessage(AnalysisImage.message);
        
        mProgress.show();  
        AnalysisImage t = new AnalysisImage(MainActivity.this, mHandler, mProgress, uri, face_image);
        t.start();
	}
}

[ComnUtil]

public class ComnUtil {
	//ファイルが存在するか確認するメソッド
    public static boolean CheckExistImage(Context context, Uri uri) {
    	//Uriをファイルパスに
    	Cursor c = context.getContentResolver().query(uri, null, null, null, null);
    	c.moveToFirst();
    	String filename = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));

    	//有無チェック
    	File image_file = new File(filename);
        if (image_file.exists()) {
        	return true;
        }
        return false;
    }
}

[AnalysisImage]

public class AnalysisImage extends Thread {
	Context context;
	Handler mHandler;
	ProgressDialog mProgress;

	Uri uri;
	ImageView face_image;

	float max_y;

	Bitmap grey_image;

	public static String message = "画像処理中……";

	public AnalysisImage(Context context, Handler mHandler, ProgressDialog mProgress, Uri uri, ImageView face_image) {
		this.context = context;
		this.mHandler = mHandler;
		this.mProgress = mProgress;

		this.uri = uri;
		this.face_image = face_image;

		max_y = 100;
	}

	//スレッド内処理
    public void run() {
    	grey_image = ToGreyImage(uri);

        //スレッドが終了した場合、終了したことをHandlerに知らせる。
        mHandler.post(new Runnable() {
            public void run() {
            	//ダイアログを消す
                mProgress.dismiss();

                if (grey_image != null) {
                	face_image.setImageBitmap(grey_image);
                }
            }
        });
    }

	// 画像を解析
	private Bitmap ToGreyImage(Uri uri) {
		// 画面の半分のサイズで画像読み込み
		Bitmap image_base = ComnUtil.getBitmapFromPath(context, uri, 2);

		// 画像の縦横の大きさを取得
		int Width = image_base.getWidth();
		int Height = image_base.getHeight();
		// 出力用画像領域確保
		Bitmap output = Bitmap.createBitmap(Width, Height,
				Bitmap.Config.ARGB_8888);
		// 画像処理用配列
		int[] pixels = new int[Width * Height];
		// pixelsの配列にimage_baseのデータを格納する
		image_base.getPixels(pixels, 0, Width, 0, 0, Width, Height);

		//解析
		for (int x = 0; x < Width; x++) {
			for (int y = 0; y < Height; y++) {
				// 1画素ずつ取得
				int pixel = pixels[x + y * Width];
				// RGB各色に分離
				int r = Color.red(pixel);
				int g = Color.green(pixel);
				int b = Color.blue(pixel);
				// 今回の画像処理はカラー画像をグレースケールに変換する
				int gray = (int) (r * 0.3 + g * 0.59 + b * 0.11);// 輝度値=R×0.30+G×0.59+B×0.11
				// データを戻す
				pixels[x + y * Width] = Color.argb(Color.alpha(pixel), gray,
						gray, gray);
			}
		}

		// 出力用の領域にセットする
		output.setPixels(pixels, 0, Width, 0, 0, Width, Height);

		return output;
	}
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください