0

反转位图时出现 OutOfMemory 错误。这是我用来反转的代码:

public Bitmap invertBitmap(Bitmap bm) {
        Bitmap src = bm.copy(bm.getConfig(), true);

        // image size
        int height = src.getHeight();
        int width = src.getWidth();
        int length = height * width;
        int[] array = new int[length];
        src.getPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight());
        int A, R, G, B;
        for (int i = 0; i < array.length; i++) {
            A = Color.alpha(array[i]);

            R = 255 - Color.red(array[i]);
            G = 255 - Color.green(array[i]);
            B = 255 - Color.blue(array[i]);

            array[i] = Color.argb(A, R, G, B);
        }
        src.setPixels(array, 0, src.getWidth(), 0, 0, src.getWidth(), src.getHeight());

        return src;
    }

图片大小约为 80 kb,尺寸为 800x1294,图片中的文字是黑色和不可见的背景。
图片位于 ViewPager 中。

4

3 回答 3

0

当您复制 bm 时,请尝试:bm = null;

于 2012-10-17T09:15:30.683 回答
0

在 android 中,由于应用程序的内存上限为 16MB(几乎在所有手机上),将整个位图保存在内存中是不明智的。这是一种常见的情况,并且正在发生在可能的开发人员身上。

您可以在stackoverflow 线程中获得有关此问题的许多信息。但我真的强烈建议你阅读 android 的官方文档,了解 Bitmaps 的有效使用。他们在这里这里

于 2012-10-17T09:18:03.590 回答
0

图像使用的内存大小与该图像的文件大小完全不同。

在文件中,图像可以使用不同的算法(jpg、png 等)进行压缩,并且当作为位图加载到内存中时,每个像素使用 2 或 4 个字节。

因此,在您的情况下(您没有播种代码,但就像您使用每个像素 4 个字节一样),每个图像的内存大小为:

size = width * height * 4; // this is aprox 2MB

在您的代码中,首先将原始位图复制到新位图,然后创建一个数组来操作颜色。因此,总的来说,您使用的是size x 3 = 6MB每个图像反转。

有很多关于如何在 Android 中处理大位图的示例,但我会留下我认为最重要的主题:

  • 尝试在上面的代码中只使用一个位图副本
  • 如果您的图像中只有文字,请使用Bitmap.Config = RGB_565. 这仅使用每个像素 2 个字节,将大小减少一半。
  • 调用recycle()不再需要的位图。
  • Bitmap.Factory. 您可以减小仍符合您需求的图像大小。

祝你好运。

于 2012-10-17T10:34:11.190 回答