撮影した画像のパスは、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; } }
コメントを残す