2016-11-23 23 views
5

Мне нужно загрузить большое изображение с размерами 2450 x 2450 пикселей.Android: Универсальный загрузчик изображений Загрузка изображения

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(url, 
     ImageConfig.getImageOptions()); 

Проблема заключается в том, на низком конечном устройстве (телефон с менее чем 1 ГБ ОЗУ), получил из памяти исключения.

Это мой DisplayImageOptions

public static DisplayImageOptions getImageOptions() { 
    DisplayImageOptions.Builder options = new DisplayImageOptions.Builder(); 
    options.delayBeforeLoading(10) 
      //The reason I'm using ARGB_8888 because I need to load bitmap without losing it's quality 
      .bitmapConfig(Bitmap.Config.ARGB_8888) 
      .imageScaleType(ImageScaleType.NONE) 
      //I'm not using disk or memory cache 
      .cacheOnDisk(false) 
      .cacheInMemory(false); 
    return options.build(); 
} 

Я пытался добавить размер цели на основе разрешения устройства, но он не работает, загружается растровый все еще имеет 2450 х 2450 пикселей размеры.

int height = orientation == Configuration.ORIENTATION_PORTRAIT ? 
     displaymetrics.heightPixels : displaymetrics.widthPixels; 

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(imageUri, 
     new ImageSize(height, height), ImageConfig.getImageOptions()); 

я пытался изменить imageScaleType к ImageScaleType.EXACTLY, загруженному растровому изображению с измененным размером 1225 х 1225 пикселей, на всех устройствах, мне нужно, чтобы получить первоначальные размеры для высокого конечного устройства и изменение их размерами размеров для низкого конечного устройства.

Основная проблема заключается в целевом размере не работает

Любая идея, как я должен загрузить изображение, особенно для низкого конечного устройства?

+0

Почему вы не используете кэш –

+0

Потому что он не нужен, даже при использовании кэша еще вылезли исключения памяти на нижнем конце устройства – user2341387

+0

Изменение размера изображения при загрузке. Довольно стандартный. – greenapps

ответ

1

попробуйте использовать некоторую библиотеку, например Picasso.

Он действительно прост в использовании и управляет изменением размера для вас.

Если вы хотите сделать это самостоятельно, я предлагаю сделать это с помощью NDK в C++, потому что там у вас есть лучшее управление памятью и вы можете помочь вам с устройствами с низким уровнем доступа.

1

Просто измените изображениеScaleType на ImageScaleType.EXACTLY_STRETCHED устранить проблему. Размер цели будет работать так, как предполагается. Stangely UIL будет пытаться поддерживать соотношение сторон на основе наибольшего значения между шириной цели и высотой цели.

DisplayImageOptions

public static DisplayImageOptions getImageOptions() { 
    DisplayImageOptions.Builder options = new DisplayImageOptions.Builder(); 
    options.delayBeforeLoading(10) 
     //The reason I'm using ARGB_8888 because I need to load bitmap without losing it's quality 
     .bitmapConfig(Bitmap.Config.ARGB_8888) 
     .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) 
     //I'm not using disk or memory cache 
     .cacheOnDisk(false) 
     .cacheInMemory(false); 
    return options.build(); 
} 

Установить размер цели, основанные на размерах устройства, когда погрузка растровых

//In this case the device I'm using for testing has 2392 pixels height 
int height = orientation == Configuration.ORIENTATION_PORTRAIT ? 
     displaymetrics.heightPixels : displaymetrics.widthPixels; 
//In this case the device I'm using for testing has 1440 pixels width 
int width = orientation == Configuration.ORIENTATION_PORTRAIT ? 
     displaymetrics.widthPixels : displaymetrics.heightPixels; 

//Loaded bitmap will has 2392 x 2392 pixels dimensions 
Bitmap bitmap = ImageLoader.getInstance().loadImageSync(imageUri, 
     new ImageSize(width, height), ImageConfig.getImageOptions());