2011-02-26 44 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

這是我在過去所做的那樣。

相關問題