Android

时间:2016-05-24 03:50:41

标签: android image

我想从图像中裁剪脸部。我有一个imageview。

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

当我点击此图片时,它会从图库中选择一张图片。代码如下:

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();
                }
        }
    }

但是图像没有裁剪。如何从图像中裁剪脸部?任何建议都有很大帮助。

2 个答案:

答案 0 :(得分:0)

要自动裁剪面,您必须以这种方式实例化FaceCropper类的对象: 从github下载AndroidFaceCropper库

https://github.com/lafosca/AndroidFaceCropper

答案 1 :(得分:0)

您可以使用this库从图像中裁剪脸部。

这将产生这样的结果。

enter image description here

您也可以选择面部类型,如。

enter image description here

最终结果。

enter image description here