2016-11-23 3 views
5

Ich muss großes Bild laden, das 2450 x 2450 Pixel Abmessungen hat.Android: Universal Image Loader Load großes Bild

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

Das Problem ist, auf Low-End-Gerät (Telefon mit weniger als 1 GB RAM), erhielt der Speicher Ausnahme.

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

Ich versuchte Zielgröße hinzuzufügen, basierend auf Geräteauflösung, aber es funktioniert nicht, geladen Bitmap hat noch 2450 x 2450 Pixel Dimensionen.

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

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

ich versuchte imageScaleType zu ImageScaleType.EXACTLY, geladen Bitmap bis 1225 x 1225 Pixel, bei dem Gerät verkleinerte mich ändern, muß I ursprüngliche Abmessungen für High-End-Gerät, und die Größe veränderten Abmessungen für Low-End-Gerät zu erhalten.

Das Hauptproblem ist Zielgröße nicht funktioniert

Jede Idee, wie soll ich das Bild geladen werden, vor allem für Low-End-Gerät?

+0

Warum verwenden Sie nicht Cache –

+0

Da es nicht nötig ist, auch wenn der Cache mit immer noch Ausnahme von Speicher auf Low-End-Gerät – user2341387

+0

Größe ändern Sie das Bild beim Laden. Ziemlich Standard. – greenapps

Antwort

1

versuchen Sie, eine Bibliothek wie Picasso zu verwenden.

Es ist wirklich einfach zu bedienen und es verwaltet die Größe für Sie.

Wenn Sie dies selbst tun möchten, empfehle ich, es mit NDK in C++ zu tun, weil Sie dort eine bessere Speicherverwaltung haben und Ihnen mit Low-End-Geräten helfen können.

1

Ändern Sie einfach imageScaleType auf ImageScaleType.EXACTLY_STRETCHED wird das Problem beheben. Die Zielgröße funktioniert wie vorgesehen. Stangly UIL wird versuchen, das Seitenverhältnis basierend auf dem größten Wert zwischen Zielbreite und Zielhöhe beizubehalten.

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

Set Zielgröße basierend auf Geräteabmessungen beim Laden von Bitmap

//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()); 
Verwandte Themen