从资源中加载后,位图宽度/高度不同

18

首先,我是一个Android编程的新手 :)

我要做的是从我的res/drawable-mdpi目录中加载一个位图,使用以下代码:

BitmapFactory.decodeResource(getResources(), R.drawable.cat_ground_01);

注销后,Bitmap的宽度/高度告诉我一个与实际不同的值。

这在像素完美地放置位图方面有些困难,例如将面部位图与口部位图重叠。

也许我只是缺少这个主题的一些知识:9 希望你能帮忙。

3个回答

31
当您使用Bitmapfactory.decodeResource()时,Android默认会选择与当前系统匹配的dpi版本进行解码。在您提到的代码中,发生以下情况:
  1. 您不能指定它是mdpi、hdpi或其他版本,它将选择与您运行的系统匹配的版本。例如,如果您在mdpi设备上运行,则会解码mdpi版本;在ldpi上运行,则解码ldpi版本。

  2. 假设您使用的是hdpi设备,但未定义mdpi资源,它将采用您的mdpi资源,并在解码期间将其变成hdpi(即将mdpi位图放大约1.5倍);同样,如果您的设备具有较低分辨率,则会缩小图像。

我猜这就是发生在您身上的事情。实际上,对于BitmapFactory,它有一个选项可以不缩放图像: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html 将inScaled设置为false即可。

非常感谢。我本来就觉得可能会发生这种事情,只是不太确定。 - X-Tender

11

你不能只是把资源放到nodpi文件夹里吗?

也就是说,将其放在res/drawable-nodpi目录下。

这是我过去的做法。


4

当我注销后,位图的宽度/高度告诉我一个其他的值而不是实际的位图大小。

检查从/drawable加载位图后的options.inTargetDensity和options.inDensity。 它们不相等(例如160和240)。如果options.inScaled设置为true(默认值)-那么位图会自动重新缩放。

另一种方法是在加载后使用Bitmap.createScaledBitmap来重新调整图像大小。因为有时您需要inScaled = true。

        //Target dimensions
        int iW = 300;
        int iH = 200;
        Bitmap mOriginalBitmap = new Bitmap;
        BitmapFactory.Options options = new BitmapFactory.Options();
        //Load image from resource
        mOriginalBitmap = BitmapFactory.decodeResource(getResources(), 
                R.drawable.sample_image_900px, options);
        //Scale to target size
        mOriginalBitmap = Bitmap.createScaledBitmap(mOriginalBitmap, iW, iH, true); 

1
这会带来额外的性能问题。只有在确实需要inScaled时,它才是一种解决方法。 - radhoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接