2011-04-08 6 views
0

J'ai besoin de charger beaucoup de grandes images (500 fichiers .png) de la carte SD à mon application. Dois-je toujours convertir les images en Bitmap et créer des fichiers Bitmap? Je ne veux pas redimensionner le tas. Existe-t-il un autre moyen de lire les images à partir d'une carte SD?Android charger de grandes images à partir du stockage externe

Répondre

0

La représentation interne de l'image dans votre application est une collection de bits et d'octets - pas une image de format spécifique (png, bmp, etc.).

L'image est convertie en cette représentation interne lorsque l'image est chargée par BitmapFactory.

Il est généralement pas une bonne idée de charger tous les bitmaps à la fois, vous courrez rapidement de la mémoire ...

+0

Merci beaucoup pour la réponse. vous avez absolument raison, mais je devrais charger toutes les images à la fois, à cause des exigences. – Maria

1

Si vous les afficher dans une vue, alors vous devez les charger dans mémoire dans leur intégralité. Vous n'avez pas mentionné la taille de vos images, mais ce que nous faisons dans notre galerie de photos, c'est de garder une liste de SoftReference à ces bitmaps, afin que le garbage collector puisse les jeter quand ils ne sont pas visible (c'est-à-dire lorsque la vue qui les affiche est défaussée - assurez-vous que cela se produit réellement, par exemple en utilisant AdapterView). Combinez cela avec le chargement paresseux de ces bitmaps et vous devriez être bon.

+0

En fait, ils ne sont pas si gros. Peut-être au total 5 MB. Mais j'ai un viewflipper avec imageviews (et d'autres widgets) dans cela. Donc, je ne peux pas utiliser Gallery. – Maria

+0

ne sait pas comment 'ViewFlipper' fonctionne en interne, mais s'il ne garde pas de fortes références à l'image' Drawable's c'est "flipping", alors ça devrait aller. – Matthias

0

Si la dimension de votre image est très grande, vous devez la redimensionner avant de la charger dans ImageView. Sinon, même une image peut facilement causer un problème de mémoire. Je ne sais pas combien d'images vous voulez afficher simultanément et quelle est leur taille. Mais je vous suggère de les redimensionner avant de les afficher.

Pour redimensionner l'image et le montrer, vous pouvez utiliser ce code:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
    bitmapOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions); 

    //reduce the image size 
    int imageWidth = bitmapOptions.outWidth; 
    int imageHeight = bitmapOptions.outHeight; 
    int scale = 1; 
    while (imageWidth/scale >= screenWidth && imageHeight/scale >= screenHeight) { 
     imageWidth = imageWidth/2; 
     imageHeight = imageHeight/2; 
     scale = scale * 2; 
    } 

    //decode the image with necessary size 
    fileInputStream = new FileInputStream(cacheFile); 
    bitmapOptions.inSampleSize = scale; 
    bitmapOptions.inJustDecodeBounds = false; 
    imageBitmap = BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions); 
    ImageView imageView = (ImageView)this.findViewById(R.id.preview); 
    imageView.setImageBitmap(imageBitmap); 

Dans mon projet android, j'utilise ce morceau de code pour redimensionner mon fond d'écran HD à examiner.

Android Save And Load Downloading File Locally

Questions connexes