2012-04-13 2 views
1

Je reçois l'erreur: java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=12295KB, Allocated=3007KB, Bitmap Size=15621KB)Android Bitmap plus grand que HEAPSIZE

La taille du bitmap est plus grand que mon HEAPSIZE .. Alors, comment puis-je faire le bitmap plus petit? Voici le code où il se bloque:

private Bitmap getPicture(int position) { 
    Bitmap bmpOriginal = BitmapFactory.decodeFile(mFileLocations.get(position)); 
    Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.RGB_565); 
    Canvas tempCanvas = new Canvas(bmResult); 
    tempCanvas.rotate(90, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2); 
    tempCanvas.drawBitmap(bmpOriginal, 0, 0, null); 
    bmpOriginal.recycle(); 
} 

il se bloque à la ligne:

Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth(), bmpOriginal.getHeight(), Bitmap.Config.RGB_565); 

et mon decodeFile:

private Bitmap decodeFile(String f){ 
    try { 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

     //The new size we want to scale to 
     final int REQUIRED_SIZE=70; 

     //Find the correct scale value. It should be the power of 2. 
     int scale=1; 
     while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE) 
      scale*=2; 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize=scale; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) { 
     Log.d(LOG_TAG, "Failed to decode file"); 
    } 
    return null; 
} 
+2

Je ne vois pas où vous utilisez votre méthode 'decodeFile'. Vous utilisez simplement 'BitmapFactory.decodeFile'. – kabuko

+0

Oh wow, je l'utilisais ailleurs mais je suppose que j'ai dû le changer quand j'essayais des choses. Merci – user1154920

Répondre

2

échelle votre image pour être dans le budget de VM ...

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filename, options); 
     options.inJustDecodeBounds = false; 
     options.inSampleSize = 4; 

     bitmap = BitmapFactory.decodeFile(filename, options); 
     if (bitmap != null) { 
      bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
     } 

Modifier la taille de l'échantillon à ce que vous voulez comme 2, 4, 6, 8, etc ..

Pour plus de détails se référer à this de site développeurs Android qui a été publié rescently, il indique clairement ce que vous devez faire pour être dans le budget VM ..

1

Deux choses:

il semble que vous utilisez la méthode BitmapFactory.decodeFile au lieu de rencontré Hod vous avez posté.

De même, il semble que la seule information que vous gardez de bmpOriginal sont ses dimensions. Alors pourquoi ne pas simplement utiliser BitmapFactory.inJustDecodeBounds comme vous le faites dans votre méthode decodeFile. Ou recyclez simplement le bitmap avant de créer le nouveau tout en conservant ses dimensions, comme ceci:

int width = bmpOriginal.getWidth(); 
int height = bmpOriginal.getHeight(); 
bmpOriginal.recycle(); 
Bitmap bmResult = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
Questions connexes