目标:我想将捕获的图像文件发送到服务器,代码我可以使用改造将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: ");
}
答案 0 :(得分:1)
在创建第二个旋转位图时出现内存不足错误
您可能没有可用的系统内存加载单张全分辨率照片,更不用说其中两张了。您的主要选择是:
请勿加载全分辨率照片。相反,选择较小的分辨率,使用BitmapFactory.Options
和inSampleSize
让Android在加载时缩小图像。这并不能保证它会起作用,因为你的堆可能相当碎片,但它增加它工作的可能性。
在服务器上进行轮换,这里有大量的RAM,大量的CPU时间等。
使用Android NDK加载照片并使用C / C ++代码进行旋转,因为本机分配(例如malloc()
)不计入堆限制。
在android:largeHeap="true"
的清单中使用<application>
。在某些设备上,这将为您提供更大的堆。无法保证您将获得更大的堆,即使使用更大的堆,您仍可能会耗尽内存。
我正在寻找可以旋转的解决方案,并将其发送到服务器而无需创建位图
Android中没有任何内容,抱歉。
答案 1 :(得分:-1)
我知道你必须在某个时候旋转位图,所以这里是我在大多数项目中使用的助手,请告诉我它是否解决了你的问题:
column