Предпочитайте размер растрового изображения с фактического Uri, до масштабирования

Если у вас есть Uri, и вам нужен Bitmap, вы могли бы теоретически сделать это

Bitmap troublinglyLargeBmp =
  MediaStore.Images.Media.getBitmap(
      State.mainActivity.getContentResolver(), theUri );

но он будет разбиваться каждый раз,

поэтому вы делаете это.........

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

AssetFileDescriptor fileDescriptor =null;
fileDescriptor =
  State.mainActivity.getContentResolver().openAssetFileDescriptor( theUri, "r");

Bitmap actuallyUsableBitmap
  = BitmapFactory.decodeFileDescriptor(
    fileDescriptor.getFileDescriptor(), null, options);

Utils.Log("'4-sample' method bitmap ... "
   +actuallyUsableBitmap.getWidth() +" "
   +actuallyUsableBitmap.getHeight() );

что фантастический и является рабочим решением.

Обратите внимание на коэффициент "четыре", который имеет тенденцию работать хорошо, в текущих условиях (2014) с типовыми размерами камеры и т.д. ОДНАКО, было бы лучше угадать или точно узнать размер данных изображения в theUri, а затем используя эту информацию, разумно выберите этот коэффициент.

Короче говоря, как правильно выбрать масштабный коэффициент при загрузке Uri?

Android-эксперты, это известная проблема, есть ли решение? Спасибо своим друзьям iOS- > Android!:)

Ответ 1

Обратитесь к руководству Android для обработки больших растровых изображений.

В частности, этот раздел:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

ИЗМЕНИТЬ

В вашем случае вы замените строку decodeResource на:

BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options);