2011-02-26 60 views
15

1st。我'新到Android编码:)从资源加载后位图宽度/高度不同

我做的是我从我的RES /绘制-MDPI与

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

加载一个位图我注销位图的宽度/高度它告诉我后,一个其他的值,然后是Bitmap realy。

这是很难放置Bitmaps pixelperfect例如用脸部位图重叠脸部的位图。

也许我错过了一些关于此主题的知识:9 我希望你能帮上忙。

回答

28

当你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假就行了。

+0

非常感谢。我认为那样的事情正在发生,但我确信。 – 2011-02-26 21:12:28

4

我注销了位图的宽度/高度后,它告诉我另一个值,那么位图是真的。

从/ 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); 
+0

这带来了额外的性能问题。这确实是inScaled确实需要的解决方法。 – radhoo 2012-05-12 11:33:54

9

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

即RES /绘制-nodpi

这是我在过去所做的那样。