从Resource加载后位图宽度/高度不同

时间:2011-02-26 16:36:47

标签: android bitmap width pixel

第一。我是Android编码的新手:)

我所做的是从res / drawable-mdpi加载一个位图

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

在我注销Bitmap的宽度/高度后,它告诉我另一个值,然后是Bitmap真的。

有点难以放置Bitmaps pixelperfect例如将脸部的位图与嘴位图重叠。

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

3 个答案:

答案 0 :(得分:30)

当您执行Bitmapfactory.decodeResource()时,Android默认会选择"匹配的"要解码的dpi版本,在你提到的代码中会发生什么:

  1. 您无法指定它是mdpi,hdpi还是其他任何内容,它会选择与您正在运行的系统匹配的版本。即,如果您在mdpi设备上运行,它将解码mdpi版本;在ldpi中,然后是ldpi版本。

  2. 假设您正在使用hdpi设备,但没有定义mdpi资源,它将采取您的mdpi资源,并且在解码期间,它将使其成为hdpi(即,它将您的mdpi位图放大到大约1.5倍);再次,如果您的设备具有较低的分辨率,那么它将缩小图像

  3. 我想这就是你发生的事情。对于BitmapFactory,它实际上可以选择不缩放图像:

    http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

    将inScaled设置为false即可。

答案 1 :(得分:10)

你不能把资源放在nodpi文件夹中吗?

即。 RES /抽拉-nodpi

这就是我过去所做的。

答案 2 :(得分:4)

  

在我注销Bitmap的宽度/高度后,它告诉我另一个值,然后是Bitmap真的。

从/ drawable加载位图后检查您的options.inTargetDensity和options.inDensity。它们不相等(例如160和240)。如果options.inScaled设置为true(默认) - 这就是自动重新缩放Bitmap的原因。

另一种方法是使用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);