Android拍摄照片成功

时间:2012-05-22 15:53:44

标签: android memory camera heap

这可能听起来像一个奇怪/愚蠢的问题。但是听我说。

  

Android应用程序,至少在T-Mobile G1上,限制为16   堆的MB

每个像素需要4个字节来存储图像(以位图形式):

public void onPictureTaken(byte[] _data, Camera _camera) {
    Bitmap temp = BitmapFactory.decodeByteArray(_data, 0, _data.length);
}           

所以1张图片,600万像素占用24MB的堆。 ( Cue Memory overflow )。

现在我非常清楚使用参数解码的能力,以有效地减小图像的大小。我甚至有一种方法可以将其缩小到所需的大小。

但是在我希望将相机用作高质量相机的情况下呢?

我不知道如何将此图像放入数据库。我一解码就错了。

注意:我需要(?)将其转换为Bitmap,以便在存储之前将其旋转。

总结一下:

  • 限制为16MB的堆
  • 图片占用24MB的堆
  • 没有足够的空间来拍摄和操纵图像

这并没有解决问题,但我推荐它作为其他人只是从一个位置加载图像的起点:  Displaying Bitmaps on android

2 个答案:

答案 0 :(得分:3)

我只能想到一些可能有帮助的事情,其中​​没有一个是最佳的

  1. 您的轮换服务器端

  2. 将捕获的数据直接存储到SDCARD而不对其进行解码,然后使用文件系统将其按块旋转,然后将其发送到数据库。网上有很多例子(如果你的角度很简单,90 180等)虽然这很费时间,因为针对SDCARD的IO操作并不是很快。

  3. 当您解码掉alpha通道时,这可能无法解决您的问题,如果您使用矩阵旋转图像,那么无论如何您都需要目标/来源

    选项opt = new Options();

    opt.inPreferredConfig = Bitmap.Config.RGB_565;

    //将原始相机解码为没有alpha通道的位图 bmp = BitmapFactory.decodeByteArray(raw,0,raw.length,opt);


  4. 可能有更好的方法可以做到这一点,但由于您的设备在堆等方面非常有限,我无法想到。

    如果有一个基于可选文件的矩阵方法(通常是我建议的选项2)或某种"分页"那将是很好的。适用于Android的系统,但这是我能想到的最好的。

答案 1 :(得分:0)

首先将其保存到文件系统,使用文件系统中的文件进行操作......