2017-10-13 152 views
-1

目标:我想发送所拍摄的图像文件服务器,在代码中,我可以通过改造发送photoFile到服务器上,但图像是在服务器端的转动,所以我的目标是观察旋转,旋转回到真实状态并将该文件发布到服务器。的OutOfMemoryError错误而旋转的位图

问题:我从凸轮捕捉图像,然后观察它的旋转,并基于此旋转,但它在创建第二个旋转的位图时发生内存不足错误。

问题:我正在寻找解决方案,我可以在不创建位图的情况下将其发送到服务器,如果没有,避免发生内存异常并将正确旋转的文件发送到服务器。

 else if (requestCode == CAPTURE_IMAGE) { 
      ExifInterface exifInterface = new ExifInterface(photoFile.getAbsolutePath()); 
      Bitmap bitmapOrg = BitmapFactory.decodeFile(photoFile.getAbsolutePath(), new BitmapFactory.Options()); 
      Matrix matrix = new Matrix(); 

      //getRotation method rightly gives 90 as rotation. 
      matrix.postRotate(getRotation(exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
            ExifInterface.ORIENTATION_NORMAL))); 

      //point of outofmemory error while creating this bitmap 
      Bitmap rotated = Bitmap.createBitmap(bitmapOrg, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
      Log.d(TAG, "onActivityResult: "); 
     } 
+0

你不需要创建位图。使用ExifInterface在文件中设置正确的旋转。阅读exif。将旋转设置为想要的。写exif回来。 – greenapps

回答

1

它给内存不足的错误,同时创造第二旋转位图

您可能没有免费的系统内存在一个单一的全分辨率照片加载,更何况他们两个。您的主要选择是:

  • 不加载全分辨率照片。相反,选择较小的分辨率,使用BitmapFactory.OptionsinSampleSize可以在加载Android时缩小图像的大小。这并不能保证它可以正常工作,因为堆可能相当分散,但它增加了它的工作可能性。

  • 做旋转的服务器,你有很多的RAM,大量的CPU时间等

  • 装入照片上,做旋转的C/C++代码,采用的是Android NDK,如原生分配(例如,malloc())不计入您的堆限制。

  • 在您的<application>的清单中使用android:largeHeap="true"。在某些设备上,这将为您提供更大的工作空间。不能保证你会得到一个更大的堆,即使堆更大,你仍然可能用完内存。

我找的解决方案,我可以旋转,并将其发送到服务器,而无需创建位图

中没有任何的Android为,对不起。

+0

是否可以在创建'rotateBitamp'之前清除'bitmapOrg',这样我就可以使用更多空间了? –

+0

@AalapPatel:不,因为那时你没有什么可以旋转的。 – CommonsWare

+0

尝试使用inSamplesize 2的第一个想法,它似乎工作,我仍然必须创建位图,然后文件,然后将该文件发布到服务器,我不认为有另一种方式发送旋转的文件与创建位图.. –

0

我知道你有一段旋转位图所以这里是我在大多数我的项目使用的帮手,让我知道如果它解决您的问题:

public static Bitmap getRotatedBitmap(Bitmap bm, float degree) { 
     Bitmap bitmap = bm; 
     if (degree != 0) { 
      Matrix matrix = new Matrix(); 
      matrix.preRotate(degree); 
//   if(shouldFlip) 
//    matrix.preScale(-1,1); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), matrix, true); 
     } 

     return bitmap; 
    } 
+0

这正是我在做什么,它给旋转位图创建outofmemory错误 –