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

Удержание камеры приводит к уменьшению изображения

Я использую камеру для захвата изображения. Это мой код, и он отлично работает:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

my onActivityResult выглядит так:

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap photo = (Bitmap) extras.get("data");
    }
}

Проблема заключается в том, что, хотя изображение, сделанное камерой, составляет 480 * 800 (я использую HTC Desire), битмап вернулся только в 194 * 324!

Любая идея, почему это происходит и как ее решить?

Спасибо!

4b9b3361

Ответ 3

Если мы хотим создать изображение высокого качества из камера У нас нет выбора, кроме как сохранить его в файл, а затем использовать:

  • Итак, прежде всего, как и прежде, нам нужно создать статический int, который будет нашим requestCode:

public static final int CAPTURE_IMAGE_FULLSIZE_ACTIVITY_REQUEST_CODE = 1 777;

  1. Затем мы снова запускаем намерение запустить Activity для результата:

Intent intent = new Intent ( "android.media.action.IMAGE_CAPTURE" ); файл file = new Файл (Environment.getExternalStorageDirectory() + File.separator + "Image.jpg" ); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(файл)); startActivityForResult (намерение, CAPTURE_IMAGE_FULLSIZE_ACTIVITY_REQUEST_CODE);

Здесь мы фактически передаем URI в качестве дополнительного для намерения, чтобы сохранить изображение.

  1. Наконец, мы получим результат в onActivityResult:

            protected void onActivityResult(int requestCode, int resultCode, Intent data) 
             {  
                 //Check that request code matches ours:
                 if (requestCode == CAPTURE_IMAGE_FULLSIZE_ACTIVITY_REQUEST_CODE) 
                 {
                     //Get our saved file into a bitmap object:
    
                    File file = new File(Environment.getExternalStorageDirectory()+File.separator +
             "image.jpg");
                    Bitmap bitmap = decodeSampledBitmapFromFile(file.getAbsolutePath(), 1000, 700);
                 }
        }
    

decodeSampledBitmapFromFile метод:

public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) 
{ // BEST QUALITY MATCH

    //First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, options);

    // Calculate inSampleSize, Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    int inSampleSize = 1;

    if (height > reqHeight) 
    {
        inSampleSize = Math.round((float)height / (float)reqHeight);
    }
    int expectedWidth = width / inSampleSize;

    if (expectedWidth > reqWidth) 
    {
        //if(Math.round((float)width / (float)reqWidth) > inSampleSize) // If bigger SampSize..
        inSampleSize = Math.round((float)width / (float)reqWidth);
    }

    options.inSampleSize = inSampleSize;

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(path, options);
}

добавить соответствующие разрешения камеры в файл манифеста:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Надеюсь, что это поможет кому-то, как серьежит решение. Поскольку это работало на 100% для меня.