从 res 的 Drawable 中创建位图的有效方法(BitmapFactory 与类型转换)

问题描述 投票:0回答:4

从资源中创建 Bitmap out of Drawable 哪种方法更有效?

Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(),
                                       R.drawable.icon_resource);

VS

Drawable myDrawable = getResources().getDrawable(R.drawable.icon_resource);
Bitmap myBitmap = ((BitmapDrawable) myDrawable).getBitmap();

由于不推荐使用 API 22 以上方法,因此请使用以下方法

Drawable myDrawable = ContextCompat.getDrawable(context, R.drawable.icon_resource)
android bitmap android-resources bitmapfactory android-drawable
4个回答
1
投票

您可以在 http://source.android.com 上查看位图工厂的源代码 特别是 decodeResource 的代码。

我认为使用 BitmapFactory 是首选,但在任何一种情况下,如果您正在解码多个位图,那么您应该调用一次 getResources() 并存储结果以用作函数的资源参数。


0
投票
Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(),
                                       R.drawable.icon_resource);

根据文档,当我们从 inputStream 构造位图时,上面的方法是最好的

VS

Drawable myDrawable = ContextCompat.getDrawable(context, R.drawable.icon_resource)
Bitmap myBitmap = ((BitmapDrawable) myDrawable).getBitmap();

这个解决方案被广泛使用并且性能更好,因为它简单地返回这个可绘制对象使用的位图来渲染。


0
投票

两者应该具有相似的解码性能。事实上,Drawable 的初始创建将调用

Drawable.createFromResourceStream()
调用
BitmapFactory.decodeResourceStream()
.

但是,

Resources.getDrawable()
Context.getDrawable()
使用 Drawable cache,所以如果您使用此 API 多次加载同一个位图,如果 Drawable 在缓存中,它可以跳过解码,性能会更好。


0
投票

这两种方法都非常有效,但在低端设备上运行速度可能会慢得多。

您只需为每个 ResId 调用 decodeResource() 一次(甚至可能在单独的线程上),然后将加载的资源存储在内存中以供后续调用,以防止臭名昭著的 ANR(应用程序无响应)。

© www.soinside.com 2019 - 2024. All rights reserved.