我有一个我想在我的应用程序中使用的 .png 文件。这张图片相当大,大约 328x32765 像素,大小为 751KB,位于我的 res 文件夹中。我在尝试将此图像设置到我的布局中时收到“java.lang.OutOfMemoryError:位图大小超出 VM 预算”的错误消息。
我不确定它是否相关,但我在同一页面上也有大约 730 个按钮,加载和工作正常,但我认为这些按钮可能也使用了大量内存?
无论哪种方式,是否有一个简单的修复程序可以帮助解决此问题或使我的 .png 图像使用更少的内存?
我有一个我想在我的应用程序中使用的 .png 文件。这张图片相当大,大约 328x32765 像素,大小为 751KB,位于我的 res 文件夹中。我在尝试将此图像设置到我的布局中时收到“java.lang.OutOfMemoryError:位图大小超出 VM 预算”的错误消息。
我不确定它是否相关,但我在同一页面上也有大约 730 个按钮,加载和工作正常,但我认为这些按钮可能也使用了大量内存?
无论哪种方式,是否有一个简单的修复程序可以帮助解决此问题或使我的 .png 图像使用更少的内存?
位图占用大量内存,如 android 网站本身关于位图的教程中所述
编辑:
尝试使用函数“Bitmap.createScaledBitmap(Bitmap, width, height, filter);” 或尝试使用教程中提到的“BitmapFactory.Options”类。
“BitmapFactory.Options”类有很大帮助,因为它的功能本身可以帮助开发人员通过缓存加载的位图来最大限度地减少 VM 在加载位图时的使用。
尽管您的图像有 731KB 大,但实际膨胀的位图大小将接近 41 兆字节。您收到错误是因为设备无法一次分配 41MB 。
不幸的是,除了加载图像的缩小版本之外,没有其他方法可以解决这个问题。
使用 Bitmap.Options 类并指定比例因子:
2 - 意味着使每边小两倍
3 - 小三倍,......
x - x 小倍
好消息是生成的膨胀位图大小将为 41/(x * x)MB:
2 - 41/4 = 10.25MB
3 - 41/9 = 4.5MB
4 - 41/16 = 2.6MB .....
试试这个并在多个设备上进行测试。
或者,将图像分解成相当小的图像并使用没有边框或分隔线的 ListView,这样您仍然会看到平滑的图像,但 ListView 也会根据需要处理启动和丢弃片段。(请注意,您将失去水平滚动的能力,因为 ListView 仅垂直滚动 - 以防万一您担心)。
Android 无法处理大位图 OOM 错误将发生。它不是 a=unexpected 错误,这是许多开发人员面临的一个大问题。尝试谷歌搜索许多文档,您会发现解释 OOM 错误。我在开发应用程序时也很挣扎。对于除去这一点,对大图像进行采样是唯一的一种方法。
int scale = "Image byte length" / 320000;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scale / 2 + scale % 2* 2;
decryptedimage=BitmapFactory.decodeByteArray(decryptedData,0,decryptedData.length,options);