Предпочитайте размер растрового изображения с фактического 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);