2013-03-06 3 views
0

Я получаю из памяти ошибки:Из ошибки памяти - BitmapFactory.decodeStream

Ниже мой код:

public static Bitmap decodeSampledBitmapFromResource(InputStream inputStream,int reqWidth, int reqHeight) { 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      byte[] buffer = new byte[1024]; 
      int len; 
      try { 
      while ((len = inputStream.read(buffer)) > -1) { 
       baos.write(buffer, 0, len); 
      } 
      baos.flush(); 
      InputStream is1 = new ByteArrayInputStream(baos.toByteArray()); 
      InputStream is2 = new ByteArrayInputStream(baos.toByteArray()); 

     // First decode with inJustDecodeBounds=true to check dimensions 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inDither=false;  
     options.inPurgeable=true;     
     options.inInputShareable=true; 
     options.inJustDecodeBounds = true; 
     // BitmapFactory.decodeResource(res, resId, options); 
     BitmapFactory.decodeStream(is1,null,options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 

     return BitmapFactory.decodeStream(is2,null,options); // error at this line 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return null; 
     } 
    } 

я получаю ошибку на этой линии

BitmapFactory.decodeStream(is2,null,options); 

I получить эту ошибку Out of memory on a 3250016-byte allocation.

Я видел много сообщений об этом, но все еще не могу найти soluti в этом случае.

+0

какая ошибка вы получаете? вставьте LogCat или StackTrace. –

+0

Почему вы сначала загружаете поток в память? Откуда вы получаете изображение с сервера или из локального файла? – Triode

+0

У меня есть папка с именем data Я получаю imges от этого с помощью classloader, который возвращает мне входной поток, и я передаю его этому методу. – Goofy

ответ

2

, пожалуйста, не ставьте эту функцию в статическую память со статическими элементами.

second Вы не используете BitmapFactory.decodeStream (is1, null, options); в любом месте, так что удалите это из своего кода.

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

public Bitmap getImage(String path) throws IOException 
    { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(path, options);   
     int srcWidth = options.outWidth; 
     int srcHeight = options.outHeight; 
     int[] newWH = new int[2]; 
     newWH[0] = srcWidth/2; 
     newWH[1] = (newWH[0]*srcHeight)/srcWidth; 

     int inSampleSize = 1; 
     while(srcWidth/2 >= newWH[0]){ 
      srcWidth /= 2; 
      srcHeight /= 2; 
      inSampleSize *= 2; 
     } 

     //  float desiredScale = (float) newWH[0]/srcWidth; 
     // Decode with inSampleSize 
     options.inJustDecodeBounds = false; 
     options.inDither = false; 
     options.inSampleSize = inSampleSize; 
     options.inScaled = false; 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(path,options); 
     ExifInterface exif = new ExifInterface(path); 
     String s=exif.getAttribute(ExifInterface.TAG_ORIENTATION); 
     System.out.println("Orientation>>>>>>>>>>>>>>>>>>>>"+s); 
     Matrix matrix = new Matrix(); 
     float rotation = rotationForImage(Add_View_Images_Activity.this, Uri.fromFile(new File(path))); 
     if (rotation != 0f) { 
      matrix.preRotate(rotation); 
     } 
     int newh = (w * sampledSrcBitmap.getHeight()) /sampledSrcBitmap.getWidth(); 
     Bitmap r=Bitmap.createScaledBitmap(sampledSrcBitmap, w, newh, true); 
     Bitmap resizedBitmap = Bitmap.createBitmap(
       r, 0, 0, w, newh, matrix, true); 

     return resizedBitmap; 
    } 
+0

эй спасибо, но его здесь здесь http: // developer.android.com/training/displaying-bitmaps/load-bitmap.html, которые используют методы, а также у меня нет пути от sdcard. У меня есть входной поток, поэтому я должен пройти – Goofy

+0

, что такое w? здесь – Goofy

+0

Вы здесь? – Goofy

Смежные вопросы