BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(Common.getRealPathFromURI(selectedImage,rootView.getContext()), bounds); BitmapFactory.Options opts = new BitmapFactory.Options(); Common.setBitmap(null); Bitmap bm = BitmapFactory.decodeFile(Common.getRealPathFromURI(selectedImage, rootView.getContext()), opts); saveToInternalSorage(bm); ExifInterface exif = new ExifInterface(Common.getRealPathFromURI(selectedImage,rootView.getContext())); String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; int rotationAngle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; Matrix matrix = new Matrix(); matrix.postRotate(rotationAngle); try { Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); bitmap2 = rotatedBitmap;//BitmapFactory.decodeStream(imageStream); } catch(OutOfMemoryError e) { }
基本上有时候,我的图像会旋转。所以我已经实现了这个功能,问题在于createbitmap我得到了outofmemory错误。我想避免这个错误,而不是修改图像的大小......和质量。我想保持相同的尺寸和质量。
答案 0 :(得分:0)
如果要使用大堆,则应使用AndroidManifest.xml编写。
机器人:largeHeap = “真”
如果要检查设备上的堆大小,请调用ActivityManager.getLargeMemoryClass()。
ActivityManager am =((ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE)); int largeMemory = am.getLargeMemoryClass();
答案 1 :(得分:0)
您遇到了更大的问题,例如您的应用无法在大多数Android设备上运行。 Use your Uri
properly并摆脱getRealPathFromURI()
。
话虽如此,但无法保证您可以分配旋转图像所需大小的位图。是否可以基于堆的状态和图像的分辨率。您的选择是:
切换到通过NDK使用本机代码进行图像旋转。这也不能保证工作,但可能性要高得多,因为你可以使用所有系统RAM。
切换为使用android:largeHeap="true"
。这对许多设备没有影响。但是,在某些情况下,它会增加您的堆限制,并使您的位图分配更有可能成功。
用于调整图像大小。
告诉用户"抱歉,我们没有足够的内存来旋转图像"。