Android: Crop an Image after Taking it With Camera with a Fixed Aspect Ratio

后端 未结 4 837
悲&欢浪女
悲&欢浪女 2020-11-27 12:34

I\'m trying to crop an image after taking it, and my code is as follows:

   private void doTakePhotoAction() {

        Intent intent = new Intent(MediaStore         


        
相关标签:
4条回答
  • 2020-11-27 12:38

    Though this might be a very old thread, I was able to crop a picture programmatically with the following code :

            btnTakePicture.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent cameraIntent = new Intent(
                        android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            }
        });
    

    then I cropped it with :

        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
    
            photo = (Bitmap) data.getExtras().get("data");
    
            performcrop();
        }
    
    }
    
    private void performcrop() {
        DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
        int width = displayMetrics.widthPixels;
        int height = displayMetrics.heightPixels;
    
        Bitmap croppedBmp = Bitmap.createBitmap(photo, 0, 0, width / 2,
                photo.getHeight());
    
        imageTaken.setImageBitmap(croppedBmp);
    }
    

    imageTaken is an ImageView Component in my view. You can see my source Here

    0 讨论(0)
  • 2020-11-27 12:49

    Check out this post. I tested it on my android 1.5 (Htc Magic) and worked perfectly.

    Android Works

    0 讨论(0)
  • 2020-11-27 12:50

    After doing some reading, I realized it can't be done so simply. My modded Contacts source is at http://github.com/Wysie, you can take a look if you're interested. Also, here's what I did to get it working:

    private void doTakePhotoAction() {
        // http://2009.hfoss.org/Tutorial:Camera_and_Gallery_Demo
        // http://stackoverflow.com/questions/1050297/how-to-get-the-url-of-the-captured-image
        // http://www.damonkohler.com/2009/02/android-recipes.html
        // http://www.firstclown.us/tag/android/
        // The one I used to get everything working: http://groups.google.com/group/android-developers/msg/2ab62c12ee99ba30 
    
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    
        //Wysie_Soh: Create path for temp file
        mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),
                            "tmp_contact_" + String.valueOf(System.currentTimeMillis()) + ".jpg"));
    
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
    
        try {
            intent.putExtra("return-data", true);
            startActivityForResult(intent, PICK_FROM_CAMERA);
        } catch (ActivityNotFoundException e) {
            //Do nothing for now
        }
    }
    
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
    
        switch (requestCode) {
    
        case CROP_FROM_CAMERA: {
            //Wysie_Soh: After a picture is taken, it will go to PICK_FROM_CAMERA, which will then come here
            //after the image is cropped.
    
            final Bundle extras = data.getExtras();
    
            if (extras != null) {
                Bitmap photo = extras.getParcelable("data");
    
                mPhoto = photo;
                mPhotoChanged = true;
                mPhotoImageView.setImageBitmap(photo);
                setPhotoPresent(true);
            }
    
            //Wysie_Soh: Delete the temporary file                        
            File f = new File(mImageCaptureUri.getPath());            
            if (f.exists()) {
                f.delete();
            }
    
            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.showSoftInput(mPhotoImageView, InputMethodManager.SHOW_IMPLICIT);
    
            break;
        }
    
        case PICK_FROM_CAMERA: {
            //Wysie_Soh: After an image is taken and saved to the location of mImageCaptureUri, come here
            //and load the crop editor, with the necessary parameters (96x96, 1:1 ratio)
    
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setClassName("com.android.camera", "com.android.camera.CropImage");
    
            intent.setData(mImageCaptureUri);
            intent.putExtra("outputX", 96);
            intent.putExtra("outputY", 96);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("scale", true);
            intent.putExtra("return-data", true);            
            startActivityForResult(intent, CROP_FROM_CAMERA);
    
            break;
    
        }
        }
    }
    

    Hope it helps :)

    0 讨论(0)
  • 2020-11-27 12:52

    Have you tried this Intent (but keeping the crop/aspect/output/return-data extras you already have)?

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    

    That's basically what the Android contacts application does, so perhaps it won't quite fit your use case (i.e. taking a photo immediately, rather than having the option of selecting one from the gallery or taking a new photo).

    Worth a try anyway! :)

    0 讨论(0)
提交回复
热议问题