android - 如何使用大位图。旋转并插入画廊

标签 android image memory camera

我需要用相机拍照,如果根据图片大小,在将其保存到图库之前旋转它。

我在用

Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(imageCaptureIntent, IMAGE_CAPTURE);

拍摄照片并将其保存到临时文件。

然后

Bitmap bmp = BitmapFactory.decodeFile(imagePath);
String str = android.provider.MediaStore.Images.Media.insertImage(cr, bmp, name, description);

保存它。

这是我试图用来旋转位图的代码

Matrix matrix = new Matrix();
matrix.postRotate(180);
Bitmap x = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
android.provider.MediaStore.Images.Media.insertImage(cr, x, name, description);

问题是我遇到了 OutOfMemoryException。

有没有更好的方法来处理位图以避免破坏内存?

~提前致谢,问候

最佳答案

我认为没有更好的方法来处理位图。您可以尝试将文件中的数据直接解析为 Byte[] 的一部分,然后分段操作;这很难,您最终可能会得到非常难看的代码。

我还建议如下:

  • 使用 android.provider.MediaStore.Images.Media.insertImage(cr, imagePath, name, description) 而不是 android.provider.MediaStore.Images.Media.insertImage (cr, bmp, name, description) 这样就不需要调用 Bitmap bmp = BitmapFactory.decodeFile(imagePath) 并且此时不会将位图加载到内存中。

  • 在整个代码中,确保除非需要,否则不会加载位图。将不再需要的位图设置为 null 并调用垃圾收集器,或使用 bmp.recycle()

关于android - 如何使用大位图。旋转并插入画廊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300019/

相关文章:

c++ - 为什么我的程序在 64 GB RAM 系统上占用的内存不超过 2 GB?

android - Android录音问题

Android - TextView 文本从其首字母居中

android - 在特定时间内获得最佳位置

Java Slick2D 图像 equals 方法

java - 图像旋转后使用 DrawImage() 显示整个图像

java - 获取Jar内文件的路径

c - 如何更改存储在内存地址的值

Android - 如何在低设备内存(内部/外部内存)上处理保存文件

android/java se SimpleDateFormat 时区问题