0

我想加载大尺寸的图像,但我有问题。它崩溃,因为 OutOfMemoryError。这是我的数组:

Integer[] img = {
R.drawble.pic1, R.drawble.pic2, R.drawble.pic3, R.drawble.pic4
};

如何将 img[0]、img[1]、img[2] 和 img[3] 转换为位图?请帮忙..对不起我的英语不好。

4

3 回答 3

0

试试这段代码,你会将一个 id 数组转换成一个数组Bitmap

    Integer[] img = { R.drawble.pic1, R.drawble.pic2, R.drawble.pic3,
            R.drawble.pic4 };

    Bitmap[] bitmap = new Bitmap[img.length];
    for (int i = 0; i < img.length; i++)
        bitmap[i] = BitmapFactory.decodeResource(getResources(), img[i]);

如果您在转换大尺寸图像时遇到问题,请查看高效显示位图

于 2013-07-21T08:45:09.493 回答
0

在这里检查:http: //developer.android.com/training/building-graphics.html

和 BitmapFactory 类:http: //developer.android.com/reference/android/graphics/BitmapFactory.html

于 2013-07-21T08:46:13.593 回答
0

Android 应用程序的堆大小有限(旧设备上的最小堆大小为 16MB)。这因设备而异,因此在 QA 期间要小心。由于位图每个像素可以占用多达 4 个字节,因此大位图可以轻松填满您的堆(1000 x 1000 像素 = 3.8MB)

这意味着您必须非常小心并使用几种策略来避免浪费内存:

  1. 不要同时将所有位图加载到内存中。例如,如果您在 a 中显示它们,则一次ViewPager只能加载 1-2 页。当页面被隐藏时,销毁其位图并调用bitmap.recycle()以确保立即释放内存。

  2. 如果位图大于您的屏幕尺寸,您可以将其缩小以节省内存。这里的技术可以让你加载它最初减少 2/3/4。如果你需要更多的微调,你可以加载它的全尺寸,然后使用Bitmap.createScaledBitmap. 只是不要recycle()立即忘记原始的大位图。

  3. 确保使用内存检查工具(例如DDMSEclipse MAT. 我建议在 Android 4+ 上进行大多数探索,因为 2.x 将位图保存在无法轻松探索的本机堆中。如果您可以将您的应用程序保持在 16MB 的峰值内存消耗以下,那么您将永远不会再次遇到 OutOfMemoryError。

于 2013-07-21T08:46:25.303 回答