1. 程式人生 > 程式設計 >解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

在使用BitmapFactory載入圖片時,常會出現這種情況,返回的圖片尺寸與實際尺寸不符。這是由於我們把圖片資源放到res/drawable檔案路徑下時,選擇的檔案不同所致,不同的資料夾會有不同的縮放。

1、載入並顯示圖片

將70*98的圖片放在res/drawable-hdpi中。

public class MainActivity extends Activity {
 TextView tv_wl;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 tv_wl=(TextView)findViewById(R.id.tv_wl);
 Bitmap bm1=BitmapFactory.decodeResource(getResources(),R.drawable.img);
 int bm_width=bm1.getWidth();
 int bm_height=bm1.getHeight();
 tv_wl.setText("width="+bm_width+";  height="+bm_height);
 } 
}

執行結果如下圖所示:

解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

這裡尺寸和原圖相同

2、修改檔案存放路徑

(1)放到res/drawable-mdpi下,執行效果如圖

解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

這裡尺寸放大了1.5倍

(2)放到res/drawable-xhdpi下,執行效果如圖

解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

尺寸縮小了1.3倍

(3)放到res/drawable-xxdpi下,執行效果如圖

解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題

尺寸縮小了2倍

3、尋找原因

電腦上圖片尺寸,單位是畫素。Android手機的螢幕分ldpi、mdpi、hdpi,甚至還有xhdpi,對於mdpi(density=160)裝置,1dp=1px,對於hdpi(density=240)的裝置,1dp=1.5px。所以,把圖片放在了res/drawable-mdpi目錄下,而執行的Android裝置螢幕屬於hdpi,導致圖片尺寸會擴大1.5倍。

4、解決辦法

(1)現在的Android裝置一般都在hdpi及以上,所以建議把圖片資源主要放在hdpi中。

(2)修改上述程式碼,設定縮放為false

BitmapFactory.Options bfoOptions = new BitmapFactory.Options();
 bfoOptions.inScaled = false; 
 Bitmap img1 = BitmapFactory.decodeResource(getResources(),R.drawable.img,bfoOptions);
 int bm_width=img1.getWidth();
 int bm_height=img1.getHeight();

執行後你會發現,不論你將圖片放在哪裡,都是原尺寸。

補充知識:Android 獲取drawable中圖片的高度寬度

1.定義一個ImageData類如下:

package com.example.vidarecyclerviewstagger;
public class ImageData {
  private int resourceId;
  private int height;
  private int width;

  public ImageData(int resourceId,int height,int width){
    this.resourceId = resourceId;
    this.height = height;
    this.width = width;
  }

  public int getResourceId() {
    return resourceId;
  }

  public void setResourceId(int resourceId) {
    this.resourceId = resourceId;
  }

  public int getHeight() {
    return height;
  }

  public void setHeight(int height) {
    this.height = height;
  }

  public int getWidth() {
    return width;
  }

  public void setWidth(int width) {
    this.width = width;
  }
}

2.在drawable中放置一些圖片:

private static int[] imgRes = new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4,R.drawable.img5,R.drawable.img6,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10,R.drawable.img11,R.drawable.img12,R.drawable.img13,R.drawable.img14,R.drawable.img15,R.drawable.img16};

3.獲取每個圖片的高度寬度並儲存資料到mData中:

private ArrayList<ImageData> mData = new ArrayList<>();

public void InitData(){
  for(int i = 0;i < imgRes.length;i++){
    BitmapFactory.Options options = new BitmapFactory.Options();
    BitmapFactory.decodeResource(getResources(),imgRes[i],options);

    //獲取圖片的寬高
    int height = options.outHeight;
    int width = options.outWidth;

    Log.i("YYYY","圖片的寬度:"+width+"圖片的高度:"+height);
    ImageData imgData = new ImageData(imgRes[i],height,width);
    mData.add(imgData);
  }
}

關鍵程式碼就這麼幾句:

BitmapFactory.Options options = new BitmapFactory.Options();
BitmapFactory.decodeResource(getResources(),options);

//獲取圖片的寬高
int height = options.outHeight;
int width = options.outWidth;

以上這篇解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。