2014-08-29 6 views
-2

После множества попыток благодаря всем энтузиастам Android я нашел способ эффективно обрабатывать большие изображения в приложениях Android, чтобы избавиться от outOfMemory ошибка. Но мне действительно нужно знать, это правильный формальный способ сделать это. или мне нужно добавить еще немного делать или какие-либо изменения должны быть сделаны. Прокомментируйте, пожалуйста.Является ли это правильным способом эффективной обработки больших изображений (чтобы избежать outOfMemoryErrorin Android

Bitmap bitmap1; 

iv1 = (ImageView) findViewById(R.id.iv1); 
iv2 = (ImageView) findViewById(R.id.iv2); 
iv3 = (ImageView) findViewById(R.id.iv3); 

BitmapFactory.Options o = new BitmapFactory.Options(); 
o.inJustDecodeBounds = true; 

BitmapFactory.decodeResource(getResources(), R.drawable.image1); 
BitmapFactory.decodeResource(getResources(), R.drawable.image2); 
BitmapFactory.decodeResource(getResources(), R.drawable.image3); 

int srcWidth = o.outWidth; 
int srcHeight = o.outHeight; 
int dstWidth = 600;   
int dstHeight = 450; 
int inSampleSize = 1;    
if (srcHeight > dstHeight || srcWidth > dstWidth) { 
      final int halfHeight = srcHeight/2; 
      final int halfWidth = srcWidth/2; 
      while ((halfHeight/inSampleSize) > dstWidth 
        && (halfWidth/inSampleSize) > dstWidth) { 
       inSampleSize *= 2; 
      } 
     }   
     o.inSampleSize = inSampleSize; 
     o.inJustDecodeBounds = false; 
     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1, o); 
     iv1.setImageBitmap(bitmap1); 


     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image2, o); 
     iv2.setImageBitmap(bitmap1); 
     Toast.makeText(getApplicationContext(), 
       "DEcoded", Toast.LENGTH_LONG).show(); 

     bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.image3, o); 
     iv3.setImageBitmap(bitmap1); 



    @Override 
    protected void onDestroy() { 
     bitmap1.recycle(); 
     super.onDestroy(); 
     Toast.makeText(getApplicationContext(), 
       "Bitmap Destroyed", Toast.LENGTH_LONG).show(); 
    } 
+0

попробуйте здесь http://codereview.stackexchange.com/ ... но сначала подумал, что WTF эти строки делают «BitmapFactory.decodeResource (getResources(), R.drawable.image1 до 2);« знаете ли вы, что в 'o.outWidth' есть только ширина от последнего изображения (image3)? – Selvin

+0

Я не понял. Не могли бы вы еще раз объяснить. Благодарю. –

ответ

1

Кажется, что ваш код делает то же самое вещь как this.

Идея состоит в том, что если мы пытаемся показать растровое изображение в области 300 * 300 View, нам не нужно ad довольно большой, скажем, 1000 * 1000 Bitmap ресурс в память. Просто сначала получите соотношение сторон, а затем декодируйте его на относительно меньшую растровую карту, чтобы сохранить память (и избежать OOM).

Так что я думаю, этого должно быть достаточно.

+0

Спасибо за ответ. –