旋转位图时出现OutOfMemoryError错误

时间:2017-10-13 15:18:47

标签: android bitmap rotation out-of-memory exif

目标:我想将捕获的图像文件发送到服务器,代码我可以使用改造将photoFile发送到服务器,但图像在服务器端轮换,所以我的目标是观察旋转,旋转回实际状态并将该文件发布到服务器。

问题:我从cam捕获图像,然后观察它的旋转,并根据我尝试将其旋转回来,但是在创建第二个旋转的位图时会出现内存不足错误。

问题我正在寻找可以旋转的解决方案,并将其发送到服务器而不创建位图,如果没有,则避免出现内存错误并将正确旋转的文件发送到服务器。

       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: ");
        } 

2 个答案:

答案 0 :(得分:1)

  

在创建第二个旋转位图时出现内存不足错误

您可能没有可用的系统内存加载单张全分辨率照片,更不用说其中两张了。您的主要选择是:

  • 请勿加载全分辨率照片。相反,选择较小的分辨率,使用BitmapFactory.OptionsinSampleSize让Android在加载时缩小图像。这并不能保证它会起作用,因为你的堆可能相当碎片,但它增加它工作的可能性。

  • 在服务器上进行轮换,这里有大量的RAM,大量的CPU时间等。

  • 使用Android NDK加载照片并使用C / C ++代码进行旋转,因为本机分配(例如malloc())不计入堆限制。

  • android:largeHeap="true"的清单中使用<application>。在某些设备上,这将为您提供更大的堆。无法保证您将获得更大的堆,即使使用更大的堆,您仍可能会耗尽内存。

  

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

Android中没有任何内容,抱歉。

答案 1 :(得分:-1)

我知道你必须在某个时候旋转位图,所以这里是我在大多数项目中使用的助手,请告诉我它是否解决了你的问题:

column