Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

После некоторого чтения я понял, что это невозможно сделать так просто. Мой 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;

    }
    }
}

Надеюсь, это поможет:)

Ответ 2

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

Android Works

Ответ 3

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

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

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

Стоит попробовать!:)

Ответ 4

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

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