Error de memoria insuficiente con bitmap

Durante el tiempo de ejecución, estoy tratando de poner una imagen en la vista de superficie. Cuando traté de usar la imagen de la carpeta Drawable obtuve un error de memoria insuficiente. Después de una búsqueda rápida en el stackoverflow, descubrí que habrá algún alivio si accedemos a la imagen desde la carpeta de activos. Pero aún obtengo el error de falta de memoria durante el tiempo de ejecución.

Analicé y descubrí que la escala ayudará a resolver este tipo de problemas relacionados con la memoria. Lo que pasa es que tengo el tamaño de imagen de 1280 x 720 y el tamaño del dispositivo también es el mismo. Por lo tanto, siento que la escala no tendrá ningún efecto.

Como tenemos expertos en esta comunidad, le agradecería si me puede ayudar con algunas sugerencias / ejemplos para resolver este tipo de problema.

Escenario 1:

Usando el bitmap de la carpeta 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; } 

Escenario 2:

Usar la carpeta Bitmap from Assets

 backgoundImage = Bitmap.createScaledBitmap(getAssetImage(context,"backgroundhomepage"), (int) dWidth, (int) dHeight, true); 

OutofMemory ocurre cuando su aplicación excede la memoria asignada en el montón. El bitmap es demasiado grande para caber en la memoria, es decir, montón. En tal caso, se queda sin memoria. Necesita escalar el bitmap y luego usar el mismo. Para eso, verifique el siguiente enlace

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

También hay un blog @ http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html (evitando memory leaks)

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

Citando de los documentos

La clase BitmapFactory proporciona varios métodos de deencoding (decodeByteArray (), decodeFile (), decodeResource (), etc.) para crear un bitmap de varias fonts. Elija el método de deencoding más apropiado según su fuente de datos de imágenes. Estos métodos intentan asignar memoria para el bitmap construido y, por lo tanto, pueden resultar fácilmente en una excepción OutOfMemory. Cada tipo de método de deencoding tiene firmas adicionales que le permiten especificar opciones de deencoding a través de la clase BitmapFactory.Options.

Establecer la propiedad inJustDecodeBounds en true mientras se decodifica evita la asignación de memoria, devuelve null para el objeto de bitmap pero establece outWidth, outHeight y outMimeType. Esta técnica le permite leer las dimensiones y el tipo de los datos de imagen antes de la construcción (y la asignación de memoria) del bitmap.

También consulte este enlace para la gestión de la memoria.

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

Tengo una solución rápida

  

poner en la etiqueta de la aplicación en el archivo de manifiesto.

Puede usar el siguiente código para cargar el bitmap desde el archivo:

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

Debería resolver su excepción de falta de memoria. El enlace aquí tiene una buena explicación detallada de tu respuesta.