2015-11-02 50 views
0

我正在创建一个位图,它需要大约11 mb在堆中,尽管它的体积很小。那么我想知道我是否可以创建位图并同时对其进行标记。我之所以要做到这一点是,内存分配,如果我从张贴在这里不同的位图的问题正确认识,那就是如何创建位图并同时对其进行解码

位图分配内存在创建时为

所以,如果它,然后缩放再次需要一定的处理时间,也增加堆大小之前,除非是没有发生垃圾收集

所以我在做什么是

 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

但我想尽量减少它们,我已经访问了一个链接,并且我想按照中显示的选项进行更多缩放。但它使用解码诸如

BitmapFactory.decodeFile(??,options); 

在那里我有没有文件从解码,我想把它从我创建位图解码并洗去最后创建位图,清除内存中的文件。

或者如果可以在创建时设置选项,以便我们可以避免额外的内存分配。

请帮忙。

+2

我不完全理解你的问题。您正在使用Bitmap.createBitmap()创建位图,并*修复其宽度和高度*。那么你为什么要稍后调整呢?只需以较小的宽度和较小的高度直接创建它。 – natario

+0

@mvai尽管你的问题清除了我有关位图的50%的观点,但我怎样才能在创建中设置选项?就像我可以在创建时设置位图的宽度和高度,但是如何通过配置设置选项 –

+0

没有更多选项可以创建像这样的位图 - 宽度,高度和颜色配置。根据你想要对位图做什么,你可以使用颜色配置,使用更少的资源(例如尝试RGB_565,你将有更少的内存分配,但也更少的质量) – natario

回答

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.inJustDecodeBounds = false; 
options.inSampleSize = sampleSize; 

Bitmap bitmap = BitmapFactory.decodeFile(??, options); 

生成位图会比所要求的范围较小,从而限制了创建内存要求位图对象。

希望这会有所帮助。

+0

虽然这是真的,但这并不能完全回答OP-他询问如何限制“Bitmap”对象的内存分配,这是他无法通过“BitmapFactory”创建的。 – natario

+0

是啊@mvai是对的,还有,如何做Bitmap bitmap = BitmapFactory.decodeFile(??,options);虽然我没有文件可以放在这里 –

相关问题