2017-07-04 34 views
-4

我只是从绘制获取的图像,并得到它转换成位图,但同时获得成位图它抛出一个错误的OutOfMemoryError无法分配与16777216个免费字节1250874912字节分配和338MB直到OOM

java.lang.OutOfMemoryError: Failed to allocate a 1250874912 byte allocation with 16777216 free bytes and 338MB until OOM

这里我的代码如下

Bitmap icon = BitmapFactory.decodeResource(getResources(), 
      R.drawable.vr_image); 
    int size = icon.getByteCount(); 

在stackoverflow上找到一些解决方案,但这些也不起作用。

所申请的标签清单

我有以下定义值

android:allowBackup="true" 
    android:hardwareAccelerated="false" 
    android:largeHeap="true" 
    android:supportsRtl="true" 

因此,任何人可以帮助我从这个问题没有得到这方面的任何解决方案。

+0

“vr_image”图像的尺寸是多少? – WarrenFaith

+0

9999x3475尺寸为图片 –

+0

,您认为“9999x3475”是移动平台上图片的正常尺寸? – WarrenFaith

回答

0

由于图像的大小,您正面临此问题。使用库如--- http://square.github.io/picasso/或者减小图像的大小太大。更好地使用毕加索。请不要在应用程序中增加大小,它会影响应用程序的性能。

+0

但我不需要把任何看法我只是想一个位图或uri因为我有钛发送此图像到另一个电话使用套接字 –

0

* without loosing image quality ,size reduce * 
 

 

 
public String compressImage(String imageUri) { 
 

 
     String filePath = getRealPathFromURI(imageUri); 
 
     Bitmap scaledBitmap = null; 
 

 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
 

 
//  by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If 
 
//  you try the use the bitmap here, you will get null. 
 
     options.inJustDecodeBounds = true; 
 
     Bitmap bmp = BitmapFactory.decodeFile(filePath, options); 
 

 
     int actualHeight = options.outHeight; 
 
     int actualWidth = options.outWidth; 
 

 
//  max Height and width values of the compressed image is taken as 816x612 
 

 
     float maxHeight = 816.0f; 
 
     float maxWidth = 612.0f; 
 
     float imgRatio = actualWidth/actualHeight; 
 
     float maxRatio = maxWidth/maxHeight; 
 

 
//  width and height values are set maintaining the aspect ratio of the image 
 

 
     if (actualHeight > maxHeight || actualWidth > maxWidth) { 
 
      if (imgRatio < maxRatio) { 
 
       imgRatio = maxHeight/actualHeight; 
 
       actualWidth = (int) (imgRatio * actualWidth); 
 
       actualHeight = (int) maxHeight; 
 
      } else if (imgRatio > maxRatio) { 
 
       imgRatio = maxWidth/actualWidth; 
 
       actualHeight = (int) (imgRatio * actualHeight); 
 
       actualWidth = (int) maxWidth; 
 
      } else { 
 
       actualHeight = (int) maxHeight; 
 
       actualWidth = (int) maxWidth; 
 

 
      } 
 
     } 
 

 
//  setting inSampleSize value allows to load a scaled down version of the original image 
 

 
     options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight); 
 

 
//  inJustDecodeBounds set to false to load the actual bitmap 
 
     options.inJustDecodeBounds = false; 
 

 
//  this options allow android to claim the bitmap memory if it runs low on memory 
 
     options.inPurgeable = true; 
 
     options.inInputShareable = true; 
 
     options.inTempStorage = new byte[16 * 1024]; 
 

 
     try { 
 
//   load the bitmap from its path 
 
      bmp = BitmapFactory.decodeFile(filePath, options); 
 
     } catch (OutOfMemoryError exception) { 
 
      exception.printStackTrace(); 
 

 
     } 
 
     try { 
 
      scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight, Bitmap.Config.ARGB_8888); 
 
     } catch (OutOfMemoryError exception) { 
 
      exception.printStackTrace(); 
 
     } 
 

 
     float ratioX = actualWidth/(float) options.outWidth; 
 
     float ratioY = actualHeight/(float) options.outHeight; 
 
     float middleX = actualWidth/2.0f; 
 
     float middleY = actualHeight/2.0f; 
 

 
     Matrix scaleMatrix = new Matrix(); 
 
     scaleMatrix.setScale(ratioX, ratioY, middleX, middleY); 
 

 
     Canvas canvas = new Canvas(scaledBitmap); 
 
     canvas.setMatrix(scaleMatrix); 
 
     canvas.drawBitmap(bmp, middleX - bmp.getWidth()/2, middleY - bmp.getHeight()/2, new Paint(Paint.FILTER_BITMAP_FLAG)); 
 

 
//  check the rotation of the image and display it properly 
 
     ExifInterface exif; 
 
     try { 
 
      exif = new ExifInterface(filePath); 
 

 
      int orientation = exif.getAttributeInt(
 
        ExifInterface.TAG_ORIENTATION, 0); 
 
      Log.d("EXIF", "Exif: " + orientation); 
 
      Matrix matrix = new Matrix(); 
 
      if (orientation == 6) { 
 
       matrix.postRotate(90); 
 
       Log.d("EXIF", "Exif: " + orientation); 
 
      } else if (orientation == 3) { 
 
       matrix.postRotate(180); 
 
       Log.d("EXIF", "Exif: " + orientation); 
 
      } else if (orientation == 8) { 
 
       matrix.postRotate(270); 
 
       Log.d("EXIF", "Exif: " + orientation); 
 
      } 
 
      scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, 
 
        scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, 
 
        true); 
 
     } catch (IOException e) { 
 
      e.printStackTrace(); 
 
     } 
 

 
     FileOutputStream out = null; 
 
     String filename = getFilename(); 
 
     try { 
 
      out = new FileOutputStream(filename); 
 

 
//   write the compressed bitmap at the destination specified by filename. 
 
      scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out); 
 

 
     } catch (FileNotFoundException e) { 
 
      e.printStackTrace(); 
 
     } 
 

 
     return filename; 
 

 
    } 
 

 
    public String getFilename() { 
 
     File file = new File(Environment.getExternalStorageDirectory().getPath(), "MyFolder/Images"); 
 
     if (!file.exists()) { 
 
      file.mkdirs(); 
 
     } 
 
     String uriSting = (file.getAbsolutePath() + "/" + System.currentTimeMillis() + ".jpg"); 
 
     return uriSting; 
 

 
    } 
 

 
    private String getRealPathFromURI(String contentURI) { 
 
     Uri contentUri = Uri.parse(contentURI); 
 
     Cursor cursor = getContentResolver().query(contentUri, null, null, null, null); 
 
     if (cursor == null) { 
 
      return contentUri.getPath(); 
 
     } else { 
 
      cursor.moveToFirst(); 
 
      int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
 
      return cursor.getString(index); 
 
     } 
 
    } 
 

 
    public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
 
     final int height = options.outHeight; 
 
     final int width = options.outWidth; 
 
     int inSampleSize = 1; 
 

 
     if (height > reqHeight || width > reqWidth) { 
 
      final int heightRatio = Math.round((float) height/(float) reqHeight); 
 
      final int widthRatio = Math.round((float) width/(float) reqWidth); 
 
      inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
 
     } 
 
     final float totalPixels = width * height; 
 
     final float totalReqPixelsCap = reqWidth * reqHeight * 2; 
 
     while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
 
      inSampleSize++; 
 
     } 
 

 
     return inSampleSize; 
 
    }

1

你可以利用毕加索库。根据设备的要求像素,您可以调整大小并加载到图像视图中

Picasso.with(context).load(incidentType.getIconServerPath()).error(R.drawable.no_image_icon).resize(mWidth, mWidth).onlyScaleDown().centerInside().into(holder.imageViewIcon, 
        new Callback() { 
         @Override 
         public void onSuccess() { 
          holder.relativeLayout.removeView(holder.progressBar); 
         } 

         @Override 
         public void onError() { 
          holder.relativeLayout.removeView(holder.progressBar); 
         } 
        }); 
     } 
    }); 
相关问题