我正在创建一个位图,它在堆中需要 11 mb ,尽管它的大小很小。好吧,我想知道我是否可以创建位图并同时进行sclae。我想这样做的原因是,内存分配,如果我从这里发布的不同位图问题中正确理解,那就是
位图在创建时分配内存
所以如果它,那么再缩放它需要一些处理时间并且还增加堆大小,直到并且除非没有发生垃圾收集
所以我正在做的是
screenHeight = displaymetrics.heightPixels;
screenWidth = displaymetrics.widthPixels;
float aspectRatio = screenWidth / screenHeight;
int modifiedScreenHeight = 400;
int modifiedScreenWidth = (int) (modifiedScreenHeight * aspectRatio);
mBitmap = Bitmap.createBitmap(modifiedScreenWidth, modifiedScreenHeight, Bitmap.Config.ARGB_8888);
所以现在它正在创建位图并分配内存,通过android studio中的内存分析工具,我可以看到内存中的 11mb 。
但是我想最小化它们,我已经访问了一个链接,我希望通过这个video中显示的选项进行更多扩展。但它使用文件进行解码,例如
BitmapFactory.decodeFile(??,options);
因为我没有要解码的文件,我想从我创建的位图中解码它,并清除最后创建的位图以清除内存。
或者,如果可以在创建时设置选项,以便我们可以避免额外的内存分配。
请帮忙。
答案 0 :(得分:1)
您可以使用BitmapFactory.Options
来使用它 - 具体来说,使用选项解码位图的宽度/高度,然后使用sampleSize来确定生成的位图的大小。
根据您的示例,您希望位图的宽度/高度为400
400 * aspectRatio
。因此,首先,您需要查看位图需要多大。这样做:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(??, options);
int bitmapWidth = options.outWidth;
int bitmapHeight = options.outHeight;
此操作仅解码位图大小,而不实际为位图的像素分配内存。这很好,因为它是一个非常快速和轻松的操作,不需要太多资源,可以帮助您在加载位图时做出更明智的决定。现在我们必须使用这些大小来确定生成的位图有多大。
int sampleSize = 1;
while (bitmapWidth / sampleSize > 400 && bitmapHieght / sampleSize > 400 * aspectRatio)
sampleSize *= 2;
sampleSize
必须是2的幂才能使其工作,它将做的是确定在将位图读入内存时“跳过”的像素数。此算法将样本大小设置为等于第一个样本大小的大小,这将产生一个立即小于所需边界的位图。如果你想要稍微不同的实现,你可以调整它。
现在你有了样本大小,在options对象中设置它并加载实际的位图:
options.inJustDecodeBounds = false;
options.inSampleSize = sampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(??, options);
生成的位图将小于所需的边界,从而限制了创建位图对象的内存要求。
希望这有帮助。