如何创建位图并同时解码它

时间:2015-11-02 09:28:32

标签: android android-bitmap bitmapfactory

我正在创建一个位图,它在堆中需要 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);

因为我没有要解码的文件,我想从我创建的位图中解码它,并清除最后创建的位图以清除内存。

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

请帮忙。

1 个答案:

答案 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);

生成的位图将小于所需的边界,从而限制了创建位图对象的内存要求。

希望这有帮助。