Android: обрезать изображение после его съемки с камерой с фиксированным соотношением сторон

Я пытаюсь обрезать изображение после его принятия, и мой код выглядит следующим образом:

private void doTakePhotoAction() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 96); intent.putExtra("outputY", 96); try { intent.putExtra("return-data", true); startActivityForResult(intent, PICK_FROM_CAMERA); } catch (ActivityNotFoundException e) { //Do nothing for now } } 

С приведенным выше кодом я могу перейти в режим обрезки и обрезать изображение. Однако соотношение сторон 1: 1 не применяется, и ни один из них не является outputX и outputY. Я считаю, что это связано с тем, что целью было сделать снимок, а не для обрезки. Я также написал другой метод для getData () из Intent, и после этого используйте следующее:

 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setClassName("com.android.camera", "com.android.camera.CropImage"); 

Однако, когда я это делаю, я получаю следующую ошибку времени выполнения:

 E/AndroidRuntime(14648): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.camera/com.android.camera.CropImage}: java.lang.NullPointerException 

Спасибо за помощь! 🙂

Solutions Collecting From Web of "Android: обрезать изображение после его съемки с камерой с фиксированным соотношением сторон"

После некоторого чтения я понял, что это невозможно сделать так просто. Мой modded источник контактов находится на http://github.com/Wysie , вы можете посмотреть, если вы заинтересованы. Кроме того, вот что я сделал, чтобы заставить его работать:

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

Надеюсь, поможет 🙂

Проверьте этот пост. Я тестировал его на своем Android-андроиде 1.5 (Htc Magic) и отлично работал.

Android работает

Пробовали ли вы это Intent (но сохраняете ли вы уже Intent у вас Intent / аспект / выход / данные возврата данных)?

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

Это в основном то, что делает приложение для контактов Android , поэтому, возможно, оно не будет соответствовать вашему варианту использования (т. Е. Сделать снимок сразу, вместо того, чтобы иметь возможность выбрать его из галереи или сделать новую фотографию).

Стоит попробовать в любом случае! 🙂

Хотя это может быть очень старый поток, я смог обрезать изображение программным путем с помощью следующего кода:

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

Затем я обрезал его:

  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 – это компонент ImageView на мой взгляд. Вы можете увидеть мой источник здесь