简体   繁体   English

Android中无法使用图像裁剪功能

[英]Image cropping is not working in Android

I want to crop face from image . 我想从图像中裁剪脸部。 I have an imageview . 我有一个imageview。

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

When I click this imageview it pick one image from Gallery . 当我单击此imageview时,它会从Gallery中选择一个图像。 The code is as below : 代码如下:

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;

            }
        });

In onActivityResult method I have added the code for cropping face from choosen image . 在onActivityResult方法中,我添加了从选择图像中裁剪面部的代码。 The code is as below : 代码如下:

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

But the image is not cropping . 但图像没有裁剪。 How can I crop face from image ? 如何从图像中裁剪脸部? Any advice is of great help . 任何建议都有很大帮助。

To crop faces automatically, you have to instantiate an object of FaceCropper class in that way: AndroidFaceCropper library download from github 要自动裁剪面,您必须以这种方式实例化FaceCropper类的对象:从github下载AndroidFaceCropper库

https://github.com/lafosca/AndroidFaceCropper https://github.com/lafosca/AndroidFaceCropper

You can use this library for croping faces from images. 您可以使用库从图像中裁剪面部。

This will produce result like this. 这将产生这样的结果。

在此输入图像描述

You can also select face type like. 您也可以选择面部类型。

在此输入图像描述

Final result. 最后结果。

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM