当我将图像放在drawable文件夹中时,为什么BitmapFactory.decodeResource()会变慢?

时间:2015-08-03 07:30:51

标签: android image android-resources

我在检查某些资源图像的某些解码时间时注意到了, 当我将资源图像移动到BitmapFactory.decodeResource()文件夹时,drawable函数的速度大约慢3-6倍。

问题:

有人知道为什么会这样吗?即使图像位于drawable文件夹中,图像也会缩放吗?如果不在每个文件夹中存储图像副本​​,是否可以防止这种情况?

详细信息:

我使用以下代码来检查图像的解码时间。

for(int i = 0; i < 5; i++){
    long time = System.currentTimeMillis();
    BitmapFactory.decodeResource(getResources(),R.drawable.welcome_01);
    Log.i(TAG, "Time: " + (System.currentTimeMillis() - time));
}

位图大小: 774 x 1280

设备:Nexus 6 (如果资源可用,则使用drawable-xxxhdpi文件夹)

测试结果:

如果图像在drawable文件夹中,则这些是解码时间:

08-03 09:18:01.072: I/MainActivity(26242): Time: 298
08-03 09:18:01.352: I/MainActivity(26242): Time: 280
08-03 09:18:01.656: I/MainActivity(26242): Time: 304
08-03 09:18:01.929: I/MainActivity(26242): Time: 272
08-03 09:18:02.263: I/MainActivity(26242): Time: 334

如果它们在drawable-xxxhdpi文件夹中,则结果如下:

08-03 09:19:49.733: I/MainActivity(26456): Time: 54
08-03 09:19:49.786: I/MainActivity(26456): Time: 53
08-03 09:19:49.841: I/MainActivity(26456): Time: 54
08-03 09:19:49.905: I/MainActivity(26456): Time: 64
08-03 09:19:49.966: I/MainActivity(26456): Time: 61

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。

它可能会帮助别人。

<强>解决方案:

将图像放入drawable-nodpi文件夹可防止图像缩放。

其他信息:

在这种情况下,在每个其他文件夹中缩放图像, 甚至在drawable文件夹中。

我在解码不同文件夹中的资源后检查了位图大小。

原始尺寸774x1280

drawable folder: Bitmap: 2709x4480
drawable-ldpi :  Bitmap: 3612x5973
drawable-mdpi: Bitmap: 2709x4480
drawable-hdpi:  Bitmap: 1806x2987
drawable-xhdpi:  Bitmap: 1355x2240
drawable-xxhdpi: Bitmap: 903x1493
drawable-xxxhdpi: Bitmap: 677x1120
drawable-nodpi:  Bitmap: 774x1280

感谢Joey Chong我找到了问题的正式答案。在android developers页面上,您可以阅读以下内容:

  

如果没有正确密度的资源,系统   加载默认资源并根据需要向上或向下扩展它们   匹配当前屏幕的密度。系统假定为默认值   资源(来自没有配置限定符的目录中的资源)   设计用于基线屏幕密度(mdpi),除非它们是   从密度特定的资源目录加载。预缩放是,   因此,当将位图大小调整为适当的时,系统会做什么   当前屏幕密度的大小。

简而言之 - 如果您没有提供密度,Android会将其视为mdpi。