我需要让用户通过设备相机一个一个地拍摄10张照片,然后对每一张进行灰度处理,最后将它们上传到服务器。
现在,在低端安卓设备(内存小于1GB)中,我遇到了一个问题,由于内存/堆问题,当从相机应用程序返回到应用程序时,页面会再次加载,所有编辑文本数据都保持设置,但是图像视图中的缩略图消失。
步骤:
- 拍摄多达10张图片
- 每个图片进行灰度处理
- 检查方向并保存正确的方向
- 显示灰度图像的小缩略图
- 第2、3和4步在AsyncTask中完成
- 提交时将所有10张图片 (从SD卡中保存的大位图) 与其他数据一起上传到服务器
我参考了以下Android开发者教程:
有关图像压缩和缩放:
http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
有关图像灰度处理的内容:
bmpGrayscale = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bitmap, 0, 0, paint);
针对方向处理:
Uri uri = Uri.parse(picPath);
ExifInterface exif = null;
try {
exif = new ExifInterface(uri.getPath());
} catch (IOException e) {
e.printStackTrace();
}
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
rotationInDegrees = exifToDegrees(rotation);
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
return 90;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
return 180;
} else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
return 270;
}
return 0;
}
public static Bitmap rotate(Bitmap b, int degrees) {
if (degrees != 0 && b != null) {
Matrix m = new Matrix();
m.setRotate(degrees, (float) b.getWidth() / 2,
(float) b.getHeight() / 2);
// m.postRotate(degrees);
try {
System.gc();
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(),
b.getHeight(), m, true);
if (b != b2) {
b.recycle();
b = b2;
}
} catch (OutOfMemoryError ex) {
throw ex;
}
}
return b;
}
请问有没有人能指导我如何压缩或处理内存,使我能够执行以上步骤而不会发生内存/堆问题。
缓存图像可以帮助吗?我尝试过了,但我的实现方式并没有起到帮助作用。
提前感谢您的帮助。