2014-04-13 104 views
3

我有一个120x120px的图像位于我的/res/drawable/目录中。这是所有设备所需的尺寸。为什么BitmapFactory.decodeResource会缩放我的图像?

要装入此位图,我使用了以下内容:

Bitmap tmpBmp = BitmapFactory.decodeResource(getResources(), R.drawable.myimage); 

的问题是,当我衡量tmpBmp,大小为360x360px。我知道如何将这个缩​​小到我需要的120x120,但这是浪费处理时间,尽管很小。

我认为这与屏幕密度有关,因为我的资源位于无密度目录中。

decodeResource缩放我的图像的原因是什么?我如何阻止它这样做?

回答

13

默认的drawable目录假定图像需要从默认的mdpi大小缩放。如果要禁用资源缩放,请将图像放入drawable-nodpi

请注意,与mdpi设备相比,xxhdpi设备上的120x120px图像(如果显示在屏幕上)会减小3倍(因为每英寸的像素数为三倍)。

+0

我只是使用临时图形,直到我遇到一个平面设计师,所以我只有几个静态大小的图像为我的设备。我认为无密度不缩放,我不知道'-nodpi'指令。 –

+0

对,'drawable'目录假设您希望图像在所有设备上具有相同的物理尺寸(即自动缩放),因为这几乎总是正确的事情(很少需要图形的物理尺寸取决于显示器的密度),为什么这是默认值,为什么'-nodpi'存在于特殊情况下。 – ianhanniballake

+0

太棒了。感谢帮助。 –

1

这是因为屏幕和图像的密度不同。那么如果你没有指定Options系统会为你做。在BitmapFactory源,你可以看到这一点:

public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) { 

    if (opts == null) { 
     opts = new Options(); 
    } 

    if (opts.inDensity == 0 && value != null) { 
     final int density = value.density; 
     if (density == TypedValue.DENSITY_DEFAULT) { 
      opts.inDensity = DisplayMetrics.DENSITY_DEFAULT; 
     } else if (density != TypedValue.DENSITY_NONE) { 
      opts.inDensity = density; 
     } 
    } 

    if (opts.inTargetDensity == 0 && res != null) { 
     opts.inTargetDensity = res.getDisplayMetrics().densityDpi; 
    } 

    return decodeStream(is, pad, opts); 
} 

因此防止结垢,你需要与inScaled=false PARAM指定Options PARAM。或将您的图像放到res/drawable-nodpi文件夹中。

相关问题