如何选择最佳图像大小以不超过虚拟机预算?

7
在我的应用中,用户选择图像,程序允许用户对图像进行更改。由于存在许多不同的Android设备,因此我的程序在一些堆大小较小的设备上崩溃。我想计算出适合用户手机的最佳尺寸,以便它不会因为VM预算而崩溃。我添加了“Picsay Pro”截图,它正是我要寻找的东西。我知道“BitmapFactory.Options”,我的唯一问题是找到一种决定图像尺寸的方法,这不会因为VM预算而导致应用崩溃。
4个回答

12

计算手机上剩余的可用空间:

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

其中,

Runtime.getRuntime().maxMemory() - 返回堆内存的总限制大小(以字节为单位)。

Debug.getNativeHeapAllocatedSize() - 返回应用程序已使用的数据量(以字节为单位)。

按照以下公式计算正在使用的位图大小:

long Bytes_allocated = (图像高度)*(图像宽度)* 4;

freeMemoryBytes_allocated进行比较,以选择适合您应用程序的大小。


1

1
我最终在手机上压缩图像有两个原因。一个是上传速度,另一个是堆问题。你可以尝试做类似的事情,或者至少发布一下堆栈跟踪!

0

到目前为止,我还没有找到任何可靠的方法来处理图像大小与可用内存之间的关系。问题在于内存很快变得分散,因此您可能有10 MB的空闲空间,但没有2 MB图像的连续空间。真正需要的是最大空闲空间的大小,但似乎没有任何方法可以获得它。更好的方法是对内存进行碎片整理,但也没有这样的功能存在。

但如果您的可用内存小于图像,则可以确定如果尝试使用它,您将会崩溃,因此至少在使用之前检查一下是有一定价值的。

随着2012年末平板电脑现在具有1920x1280分辨率,我们现在需要20MB的连续内存来存储单个背景图像!看起来其中一些平板电脑现在允许堆达到256MB,但是虽然增加更多的VM空间似乎可以解决问题,但我们真正需要的是一个内存碎片整理器或者一种保留空间的方法。

如果图像大小未经缩放或修改,并且每个更改的图像都具有相同的大小,并且您将应用程序限制为Android 3.0+,则有一个技巧可能有所帮助:

Options opt2 = new BitmapFactory.Options();
opt2.inBitmap = mBitmap;        // reuse mBitmap to reduce out of memory errors
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2);

这将重复使用相同的内存区域mBitmap来存储图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接