HT-03Aで笑い男の模倣ツールの模倣ツール
MediaStoreのクラスを見ていたらおもしろそうな物があったので試してみた。
もう少し改善してON,OFF切り替えるようにすれば肖像権対策にいいかも?
コップレさんとか消すの大変だしね。
アプリケーションの動作
標準カメラアプリをインテント起動 ↓ bitmapを取得 ↓ 顔認識 ↓ 笑い男のイメージを上書き
ネタ元はこちら
http://kougaku-navi.net/koukaku.html
顔認識のコードはこちらを参考にさせていただきました。
http://blog.livedoor.jp/deeds_not_words/archives/624855.html
adakoda.com -
ありがとうございます!
コードはこんな感じ
package jp.lnc.TestMediaStoreImage; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint.Style; import android.media.FaceDetector; import android.media.FaceDetector.Face; import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.widget.ImageView; public class TestImageActivity extends Activity { /** Called when the activity is first created. */ private static final int CAMERA_ACTIVITY = 0; private static final String TAG = null; private ImageView mImageView; private Bitmap mCameraBitmap; Bitmap bitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.happy); // 笑い男のイメージ bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.c00); // インテントを生成 Intent mIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 描写用のviewを取得 mImageView = (ImageView) findViewById(R.id.ImageView01); // インテントを投げる startActivityForResult(mIntent, CAMERA_ACTIVITY); } // アクティビティの結果を取得したらここに入る protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); Log.i(TAG, "Result code = " + resultCode); if (resultCode == RESULT_CANCELED) { return; } switch (requestCode) { case CAMERA_ACTIVITY: Bundle b = intent.getExtras(); Bitmap bm = (Bitmap) b.get("data"); // イメージを渡す setImageBitmap(bm); // イメージの大きさ判定 if (b.containsKey(MediaStore.EXTRA_OUTPUT)) { Log.i(TAG, "This is a large image: "); } else { Log.i(TAG, "This is a small image: "); } break; } } private void setImageBitmap(Bitmap bm) { if(false){ mImageView.setImageBitmap(bm); }else{ this.mCameraBitmap = bm; setFaceImage(); } } //顔認識上書き void setFaceImage(){ FaceDetector.Face[] faces = new FaceDetector.Face[3]; // 結果受け取り用 FaceDetector detector = new FaceDetector( mCameraBitmap.getWidth(), // ビットマップの幅 mCameraBitmap.getHeight(), // ビットマップの高さ faces.length); // ここでは、最大3つの顔認識結果を受け取れるように指定 int numFaces = detector.findFaces(mCameraBitmap, faces); // 顔認識実行 if (numFaces > 0) { Bitmap newBitmap = mCameraBitmap.copy(Bitmap.Config.RGB_565, true); Paint paint = new Paint(); paint.setColor(Color.argb(255, 255, 0, 0)); // 赤 paint.setStyle(Style.STROKE); // 塗りつぶしなしの線 Canvas canvas = new Canvas(newBitmap); for (int i = 0; i < numFaces; i++) { // 認識した数だけ処理 Face face = faces[i]; PointF midPoint = new PointF(0, 0); face.getMidPoint(midPoint); // 顔認識結果を取得 float eyesDistance = face.eyesDistance(); // 描写元の設定 Rect src = new Rect(); src.left = 0 ; src.top = 0 ; src.right = bitmap.getWidth() ; src.bottom = bitmap.getHeight() ; // 描写先の設定 RectF rect = new RectF(); rect.left = midPoint.x - (eyesDistance*2) ; rect.top = midPoint.y - (eyesDistance*2) ; rect.right = midPoint.x + (eyesDistance*2) ; rect.bottom = midPoint.y + (eyesDistance*2) ; canvas.drawBitmap(bitmap, src, rect, paint); // 笑い男に } mImageView.setImageBitmap(newBitmap); } } }