Ошибка нехватки памяти с растровым изображением

Во время выполнения я пытаюсь поместить изображение в вид поверхности. Когда я попытался использовать изображение из папки Drawable, у меня возникла ошибка «Недостаточно памяти». После быстрого поиска в потоке стека я обнаружил, что облегчение будет, если мы получим доступ к изображению из папки ресурсов. Но все равно я получаю ошибку «Недостаточно памяти» во время выполнения.

Я проанализировал и обнаружил, что масштабирование поможет в решении подобных проблем, связанных с памятью. Дело в том, что у меня размер изображения 1280 х 720 и размер устройства тоже одинаковый. Поэтому я чувствую, что масштабирование не будет иметь никакого эффекта.

Поскольку у нас есть эксперты в этом сообществе, я был бы признателен, если бы вы могли помочь мне с некоторыми предложениями / примерами для решения такого рода проблемы.

Сценарий 1:

Использование растрового изображения из папки Drawable.

backgoundImage = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.backgroundhomepage), (int) dWidth, (int) dHeight, true);

    /***********************************************************************************************************************************************************
    1.  To get the image from asset library
     **************************************************************************************************************************************************************/ 

    public  Bitmap getAssetImage(Context context, String filename) throws IOException {
        AssetManager assets = context.getResources().getAssets();
        InputStream buffer = new BufferedInputStream((assets.open("drawable/" + filename + ".png")));
        Bitmap bitmap = BitmapFactory.decodeStream(buffer);
        return bitmap;
    }
Сценарий 2:

Использование растрового изображения из папки «Активы»

backgoundImage = Bitmap.createScaledBitmap(getAssetImage(context,"backgroundhomepage"), (int) dWidth, (int) dHeight, true);
 George Lungu28 дек. 2013 г., 19:02
у меня тоже была эта проблема. ищите здесь решениеstackoverflow.com/questions/20817369/...

Ответы на вопрос(3)

Получил быстрое решение

<application android:largeheap="true">
</application>

поместите в тег appplication в файле манифеста.

 iappmaker26 июл. 2015 г., 04:52
какие-либо побочные эффекты для этого?
 Nikhil Borad01 авг. 2015 г., 11:02
Использование LargeHeap не рекомендуется во всех случаях, пожалуйста, используйте его очень осторожно, это может замедлить работу других приложений, а также повлиять на ваше приложение.Реактивность, так как сборщик мусора должен быть запрошен чаще. Для получения дополнительной информации проверьте эту речь от Google I / Oyoutube.com/watch?v=_CruQY55HOk

ия из файла:

private Bitmap decodeFile(File f,int req_Height,int req_Width){
    try {
        //decode image size
        BitmapFactory.Options o1 = new BitmapFactory.Options();
        o1.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o1);


        //Find the correct scale value. It should be the power of 2.
        int width_tmp = o1.outWidth;
        int height_tmp = o1.outHeight;
        int scale = 1;

        if(width_tmp > req_Width || height_tmp > req_Height)
        {
             int heightRatio = Math.round((float) height_tmp / (float) req_Height);
             int widthRatio = Math.round((float) width_tmp / (float) req_Width);


             scale = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        o2.inScaled = false;
        return BitmapFactory.decodeFile(f.getAbsolutePath(),o2);
    } 
    catch(Exception e) 
    {
      e.printStackTrace();
    }
    return null;
}

Это должно разрешить ваше исключение из нехватки памяти. Ссылка на сайтВот имеет хорошее подробное объяснение вашего ответа.

 Panky9027 мая 2013 г., 06:01
И приведенный выше код будет выполнять выборку изображения, загружая уменьшенную версию в память.
 Raghunandan27 мая 2013 г., 06:14
@ Panky90 ссылка на публикацию в порядке, но я предлагаю вам опубликовать важные части темы в самом ответе. Также объясните вкратце.
 Panky9027 мая 2013 г., 05:57
Посмотрите на это, это объясняет проблему очень эффективно.developer.android.com/training/displaying-bitmaps/index.html
 Panky9027 мая 2013 г., 06:20
@Raghunandan Хорошо, яЯ приму это во внимание. Спасибо за предложение, яЯ просто обновлю этот ответ сейчас. Я думал, что ссылка имеет хорошее простое описание его проблемы и не требует пояснений, поэтому я избежал объяснения.
 Raghunandan27 мая 2013 г., 06:02
@ Panky90 вы загружаете уменьшенную версию в память. Ваше растровое изображение может быть слишком большим и, следовательно, превышает объем памяти в куче, ведущей к OOM.
 iappmaker27 мая 2013 г., 05:51
Не могли бы вы объяснить, что это делает и почему я должен сделать это для изображения 720 x 1280, которое имеет тот же размер моего устройства?
 Panky9027 мая 2013 г., 06:06
@Raghunandan да, вот что говорит ссылка, которую я разместил, а также подробно отвечает на его вопрос.
Решение Вопроса

когда ваше приложение превышает память, выделенную в куче. Растровое изображение слишком велико, чтобы поместиться в памяти, то есть в куче. В таком случае у вас заканчивается память. Вам нужно уменьшить растровое изображение, а затем использовать его. Для этого проверьте ссылку ниже

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html.

Также есть блог @http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html (избегая утечек памяти)

 public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){
 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_WIDTH=WIDTH;
     final int REQUIRED_HIGHT=HIGHT;
     //Find the correct scale value. It should be the power of 2.
     int scale=1;
     while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)
         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) {}
 return null;
}

Цитирование из документов

Класс BitmapFactory предоставляет несколько методов декодирования (decodeByteArray (), decodeFile (), decodeResource () и т. Д.) Для создания растрового изображения из различных источников. Выберите наиболее подходящий метод декодирования в зависимости от источника данных вашего изображения. Эти методы пытаются выделить память для созданного растрового изображения и поэтому могут легко привести к исключению OutOfMemory. Каждый тип метода декодирования имеет дополнительные подписи, которые позволяют указывать параметры декодирования с помощью класса BitmapFactory.Options.

Установка для свойства inJustDecodeBounds значения true, в то время как декодирование позволяет избежать выделения памяти, возвращая значение null для объекта растрового изображения, но задав outWidth, outHeight и outMimeType. Этот метод позволяет считывать размеры и тип данных изображения до построения (и выделения памяти) растрового изображения.

Также проверьте эту ссылку для управления памятью.

https://www.youtube.com/watch?v=_CruQY55HOk

 Raghunandan27 мая 2013 г., 06:34
 iappmaker27 мая 2013 г., 06:26
Вы хотите сказать, что 127 КБ - это большой инструмент? Если я уменьшу масштаб, будут ли какие-либо существенные изменения в качестве изображения?
 Raghunandan27 мая 2013 г., 06:23
он слишком велик, и ваше приложение превысит размер выделенной кучи. следовательно, вам нужно уменьшить. Каждое устройство будет иметь свой собственный размер кучи. каждому приложению выделяется определенная область памяти в куче. Если вы превысите выделенную память, вы можете столкнуться с утечками памяти. Какие'Размер экрана и ширина?
 Raghunandan27 мая 2013 г., 06:27
у вас есть другие изображения в вашем приложении? какая у вас высота экрана и ширина.
 iappmaker27 мая 2013 г., 06:22
Размеры растрового изображения - 1280 x 720 и только размер 127 КБ, а также размер устройства совпадает с размером изображения 1280 x 720. Есть ли причина, почему мы его масштабируем?
 Raghunandan27 мая 2013 г., 06:30
@iappmaker вы проверяете размер кучи. проверьте ссылкуdeveloper.android.com/reference/android/app/...
 iappmaker27 мая 2013 г., 06:33
Да, еще 4 изображения по 12 КБ каждый. Спецификация устройства - 720 x 1280 пикселей, 4,3 дюйма (плотность пикселей ~ 342 ppi)

Ваш ответ на вопрос