【问题标题】:How to create the bitmap and decode it at the same time如何创建位图并同时对其进行解码
【发布时间】:2015-11-02 09:28:31
【问题描述】:

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

但我想最小化它们,我访问了一个链接,我想通过选项进行更多缩放,如video 所示。但它使用文件来解码,例如

BitmapFactory.decodeFile(??,options);

由于我没有要解码的文件,我想从我创建的位图中对其进行解码,并洗掉最后创建的位图以清除内存。

或者是否可以在创建时设置选项,以避免额外的内存分配。

请帮忙。

【问题讨论】:

  • 我不完全理解你的问题。您正在使用 Bitmap.createBitmap() 创建位图,并固定其宽度和高度。那你为什么要在以后缩小它呢?直接用更小的宽度和更少的高度创建它。
  • @mvai 虽然你的问题清除了我关于位图的 50% 的看法,但我如何在创作中设置选项?就像我可以在创建时设置位图的宽度和高度,但是如何使用配置设置选项
  • 这样创建的位图没有更多选项 - 宽度、高度和颜色配置。根据您想对该位图执行的操作,您可以使用使用较少资源的颜色配置(例如,尝试 RGB_565,您将分配更少的内存,但质量也会降低)

标签: android android-bitmap bitmapfactory


【解决方案1】:

您可以使用BitmapFactory.Options 来使用它 - 具体来说,使用选项来解码位图的宽度/高度,然后使用 sampleSize 来确定生成的位图有多大。

根据您的示例,您希望位图的宽度/高度为 400 by 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);

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

希望这会有所帮助。

【讨论】:

  • 虽然是真的,但这并不能完全回答 OP - 他询问的是关于限制 Bitmap 对象的内存分配,他无法通过 BitmapFactory 创建该对象。
  • 是的@mvai 是对的,还有,如何做Bitmap bitmap = BitmapFactory.decodeFile(??, options);虽然我没有文件可以放在这里
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2012-03-29
  • 1970-01-01
  • 2019-10-04
  • 2020-06-26
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多