2016-05-24 11 views
1

画像から顔を切り抜きたい。私はイメージビューを持っています。Androidで画像の切り抜きが機能しない

iv1 = (ImageView) MainActivity.this.findViewById(R.id.img1); 

この画像ビューをクリックすると、ギャラリーから1つの画像が選択されます。コードは次のとおりです。

iv1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
       photoPickerIntent.setType("image/*"); 
       startActivityForResult(photoPickerIntent, SELECT_PHOTO); 
       imgNo = 1; 

      } 
     }); 

onActivityResultメソッドでは、選択した画像から切り抜くためのコードを追加しました。コードは次のとおりです。

@Override 
    protected void onActivityResult(int requestCode, int resultCode, 
      Intent imageReturnedIntent) { 
     super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

     switch (requestCode) 
     { 
      case SELECT_PHOTO: 
       if (resultCode == RESULT_OK && imgNo == 1) 
       { 
        selectedImage = imageReturnedIntent.getData(); 
        try { 
         imageStream = getContentResolver().openInputStream(
           selectedImage); 
        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        yourSelectedImage = BitmapFactory.decodeStream(imageStream); 

         iv1.setImageBitmap(yourSelectedImage); 
         path1 = selectedImage.getPath(); 
         bmpimg1 = yourSelectedImage; 


         viewHeight = iv1.getMeasuredHeight(); 
         viewWidth = iv1.getMeasuredWidth(); 
         try { 

          Paint paint = new Paint(); 
          paint.setFilterBitmap(true); 

          Bitmap bitmapOrg =yourSelectedImage; 

          int targetWidth = bitmapOrg.getWidth(); 
          int targetHeight = bitmapOrg.getHeight(); 

          Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
            targetHeight, Bitmap.Config.ARGB_8888); 

          RectF rectf = new RectF(0, 0, viewWidth, viewHeight); 

          Canvas canvas = new Canvas(targetBitmap); 
          Path path = new Path(); 

          path.addRect(rectf, Path.Direction.CW); 
          canvas.clipPath(path); 

          canvas.drawBitmap(
            bitmapOrg, 
            new Rect(0, 0, bitmapOrg.getWidth(), bitmapOrg 
              .getHeight()), new Rect(0, 0, targetWidth, 
              targetHeight), paint); 

          Matrix matrix = new Matrix(); 
          matrix.postScale(1f, 1f); 

          BitmapFactory.Options bitmapFatoryOptions = new BitmapFactory.Options(); 
          bitmapFatoryOptions.inPreferredConfig = Bitmap.Config.RGB_565; 

          bitmapOrg = yourSelectedImage; 

          myFace = new FaceDetector.Face[5]; 
          myFaceDetect = new FaceDetector(targetWidth, targetHeight, 
            5); 
          int numberOfFaceDetected = myFaceDetect.findFaces(
            bitmapOrg, myFace); 
          Bitmap resizedBitmap = null; 
          if (numberOfFaceDetected > 0) { 
           PointF myMidPoint = null; 
           android.media.FaceDetector.Face face = myFace[0]; 
           myMidPoint = new PointF(); 
           face.getMidPoint(myMidPoint); 
           myEyesDistance = face.eyesDistance() + 20; 

           if (myMidPoint.x + viewWidth > targetWidth) { 
            while (myMidPoint.x + viewWidth > targetWidth) { 
             myMidPoint.x--; 
            } 
           } 
           if (myMidPoint.y + viewHeight > targetHeight) { 
            while (myMidPoint.y + viewHeight > targetHeight) { 
             myMidPoint.y--; 
            } 
           } 
           resizedBitmap = Bitmap.createBitmap(bitmapOrg, 
             (int) (myMidPoint.x - myEyesDistance), 
             (int) (myMidPoint.y - myEyesDistance), 
             viewWidth, viewHeight, matrix, true); 
          } else { 
           resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, 
             viewWidth, viewHeight, matrix, true); 
          } 
          /* convert Bitmap to resource */ 
          // Bitmap resizedBitmap = Bitmap.createBitmap(targetBitmap, 
          // 0, 
          // 0, viewWidth, viewHeight, matrix, true); 
          BitmapDrawable bd = new BitmapDrawable(resizedBitmap); 

          iv1.setBackgroundDrawable(new BitmapDrawable(
            getCroppedBitmap(bd.getBitmap()))); 

         } catch (Exception e) { 
          System.out.println("Error1 : " + e.getMessage() 
            + e.toString()); 
         } 
         iv1.invalidate(); 
       } 
       else if (resultCode == RESULT_OK && imgNo == 2) 
       { 

        Bitmap photo = (Bitmap) imageReturnedIntent.getExtras().get("data"); 
        iv2.setImageBitmap(photo); 

       // path2 = imageReturnedIntent.getData().getPath(); 
        bmpimg2 = photo; 
        iv2.invalidate(); 
       } 
     } 
    } 

ただし、画像は切り抜かれていません。どうやってイメージから顔を切り取ることができますか?どんな助言も大きな助けになる。作物へ

答えて

0

は自動的に、あなたがそのようにFaceCropperクラスのオブジェクトをインスタンス化する必要が直面している: AndroidFaceCropperライブラリのダウンロードをgithubの

から

https://github.com/lafosca/AndroidFaceCropper

0

をあなたが画像から顔をcropingためthisライブラリを使用することができます。

このような結果が得られます。

enter image description here

また、のような顔のタイプを選択することができます。

enter image description here

最終結果。

enter image description here

関連する問題