2015-04-29 3 views
1

Я наткнулся на это на веб-сайте разработчика в разделе «Загрузка больших растровых изображений».Что нужно для декодирования bitmapfactory дважды?

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
    int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    **BitmapFactory.decodeResource(res, resId, options);** 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

Мой вопрос: что является точкой декодирования ресурсов в первый раз, когда вы можете установить inSampleSize, а затем декодирования.

ответ

2

Это обычная стратегия при загрузке изображений.

Поскольку вы почти никогда не хотите загружать изображение с более высоким разрешением, чем может быть отображено, а так как Android довольно сложно, когда дело доходит до управления памятью, эта система позволяет вам сначала оценить, какой размер будет отображаться , и когда вы на самом деле загружаете, вы можете контролировать, сколько нужной выборки вы хотите.

Сбрасывание, просто поместите, означает, сколько пикселей вы собираетесь пропустить. Например, понижающая дискретизация 1 не уменьшает. Однако понижающая дискретизация из 2 будет пропускать каждый другой пиксель как по горизонтали, так и по вертикали, что приводит к растровому изображению с половиной ширины и половиной высоты и одной четвертью памяти.

Если вы посмотрите на этот код:

final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    **BitmapFactory.decodeResource(res, resId, options);** 

Что здесь происходит, когда вы совершаете звонок «decodeResource», вы передавая Options объект с inJustDecodeBounds = true. Это говорит, что BitmapFactory фактически не загружает пиксели изображения, а вместо этого просто расшифровывает границы изображения - намного дешевле. Когда вы это сделаете, результат BitmapFactory будет null, но параметры Options (outWidth, outHeight) будут иметь действительные значения, описывающие ширину/высоту изображения. С помощью этого вы можете вычислить, какой размер выборки вы хотите, и в конечном итоге загрузить фактическое изображение, но с размером, оптимальным для вашего приложения.

1

Если вы заметили в первом декодировании он установил

options.inJustDecodeBounds = true; 

С апи документ «Если установлено значение истинно, то декодер будет возвращать нуль (не растровую), но вне поля ... все равно будет установлен , позволяя вызывающему абоненту запрашивать растровое изображение без необходимости выделять память для своих пикселей ».

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inJustDecodeBounds

При выполнении декодирования с этой опцией битовой карты не будет загружен.

Смежные вопросы