2016-11-23 21 views
5

Potrzebuję załadować duży obraz o wymiarach 2450 x 2450 pikseli.Android: Universal Image Loader Załaduj duży obraz

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

Problemem jest na niskim urządzenie końcowe (telefon mniej niż 1 GB RAM), dostaje z pamięci wyjątku.

To jest moje 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(); 
} 

Próbowałem dodać wielkość docelowego na podstawie uchwały urządzenia, ale to nie działa, załadowane mapy bitowej nadal ma 2450 x 2450 pikseli wymiary.

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

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

Próbowałem zmienić imageScaleType do ImageScaleType.EXACTLY, załadowaną bitmapę zmienionym rozmiarze do 1225 x 1225 pikseli, na wszystkich urządzeń, muszę dostać oryginalne wymiary wysokiej urządzenia końcowego, i przeskalowane wymiary niskim urządzeniu końcowym.

Głównym problemem jest wielkość docelowa nie działa

Każdy pomysł, w jaki sposób należy załadować obraz, zwłaszcza na niskim urządzenia końcowego?

+0

Czemu nie wykorzystujących pamięć podręczną –

+0

ponieważ nie jest to konieczne, nawet podczas korzystania z pamięci podręcznej nadal wysiadł z wyjątkiem pamięci na urządzeniu o niższym końcu – user2341387

+0

Zmień rozmiar obrazu podczas ładowania. Całkiem standardowe. – greenapps

Odpowiedz

1

spróbować użyć niektóre biblioteki jak Picasso.

Jest bardzo łatwy w użyciu i zarządzać rozmiar dla Ciebie.

Jeśli chcesz zrobić to sam, proponuję zrobić to z NDK w C++, bo nie masz lepsze zarządzanie pamięcią i może pomóc w niskich urządzeniach końcowych.

1

Wystarczy zmienić imageScaleType do ImageScaleType.EXACTLY_STRETCHED będzie rozwiązać problem. Docelowy rozmiar będzie działać zgodnie z założeniami. Stangely UIL będzie starał się utrzymać proporcje w oparciu o największą wartość między docelową szerokością a docelową wysokością.

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(); 
} 

wielkość zbioru docelowego w oparciu o wymiarach urządzenia podczas ładowania bitmapy

//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()); 
Powiązane problemy