1

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

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

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

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

所以 1 张 6 兆像素的图像占用了 24MB 的堆空间。(提示内存溢出)。

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

但是在我想将相机用作优质相机的场景中呢?

我不知道如何将此图像输入数据库。一旦我解码,它就会出错。

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

所以总结一下:

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

这并不能解决问题,但我建议将其作为其他仅从某个位置加载图像的起点: Displaying Bitmaps on android

4

2 回答 2

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);


可能有更好的方法可以做到这一点,但由于您的设备在堆等方面非常有限。我想不出任何办法。

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

于 2012-05-22T16:51:53.873 回答
0

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

于 2012-05-22T15:57:25.060 回答