【问题标题】:Why does BitmapFactory.decodeResource scale my image?为什么 BitmapFactory.decodeResource 会缩放我的图像?
【发布时间】:2014-05-27 16:25:23
【问题描述】:

我的/res/drawable/ 目录中有一张 120x120 像素的图片。这是所有设备所需的大小。

要加载此位图,我使用以下内容:

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

问题是当我测量tmpBmp 时,尺寸是360x360px。我知道如何将其缩小到我需要的 120x120,但这是在浪费处理时间,虽然很少。

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

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

【问题讨论】:

    标签: android bitmap drawable android-resources bitmapfactory


    【解决方案1】:

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

    请注意,如果在屏幕上显示 120x120 像素的图像,在 xxhdpi 设备上将比 mdpi 设备小 3 倍(因为每英寸的像素数是其三倍)。

    【讨论】:

    • 在遇到平面设计师之前,我只是使用临时图形,因此我的设备只有几个静态大小的图像。我假设 densityless 没有缩放,我不知道 -nodpi 指令。
    • 对,drawable 目录假定您希望图像在所有设备上具有相同的物理尺寸(即自动缩放),因为这几乎总是正确的做法(您很少想要图形的物理尺寸取决于显示器的密度)因此为什么这是默认设置以及为什么 -nodpi 存在于特殊情况。
    • 太棒了。感谢您的帮助。
    【解决方案2】:

    那是因为您的屏幕密度和图像密度不同。然后,如果您不指定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);
    }
    

    因此,为了防止缩放,您需要指定 Options 参数和 inScaled=false 参数。或者把你的图片放到res/drawable-nodpi文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-05
      相关资源
      最近更新 更多