Это правильный способ эффективной обработки больших изображений (чтобы избежать OutOmMemoryErrorin Android

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

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

1 ответ

Решение

Кажется, ваш код делает то же самое, что и этот.

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

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

Другие вопросы по тегам