解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題
在使用BitmapFactory加載圖片時,常會出現(xiàn)這種情況,返回的圖片尺寸與實(shí)際尺寸不符。這是由于我們把圖片資源放到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);
}
}
運(yùn)行結(jié)果如下圖所示:

這里尺寸和原圖相同
2、修改文件存放路徑
(1)放到res/drawable-mdpi下,運(yùn)行效果如圖

這里尺寸放大了1.5倍
(2)放到res/drawable-xhdpi下,運(yùn)行效果如圖

尺寸縮小了1.3倍
(3)放到res/drawable-xxdpi下,運(yùn)行效果如圖

尺寸縮小了2倍
3、尋找原因
電腦上圖片尺寸,單位是像素。Android手機(jī)的屏幕分ldpi、mdpi、hdpi,甚至還有xhdpi,對于mdpi(density=160)設(shè)備,1dp=1px,對于hdpi(density=240)的設(shè)備,1dp=1.5px。所以,把圖片放在了res/drawable-mdpi目錄下,而運(yùn)行的Android設(shè)備屏幕屬于hdpi,導(dǎo)致圖片尺寸會擴(kuò)大1.5倍。
4、解決辦法
(1)現(xiàn)在的Android設(shè)備一般都在hdpi及以上,所以建議把圖片資源主要放在hdpi中。
(2)修改上述代碼,設(shè)置縮放為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();
運(yùn)行后你會發(fā)現(xiàn),不論你將圖片放在哪里,都是原尺寸。
補(bǔ)充知識: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.獲取每個圖片的高度寬度并保存數(shù)據(jù)到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);
}
}
關(guān)鍵代碼就這么幾句:
BitmapFactory.Options options = new BitmapFactory.Options(); BitmapFactory.decodeResource(getResources(),imgRes[i],options); //獲取圖片的寬高 int height = options.outHeight; int width = options.outWidth;
以上這篇解決Bitmap通過getWidth和getHeight獲取尺寸不符的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)圖片瀏覽并改變透明度
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片瀏覽并改變透明度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08
Android SurfaceView基礎(chǔ)用法詳解
這篇文章主要介紹了Android SurfaceView基礎(chǔ)用法詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android自定義view實(shí)現(xiàn)圓形waveview
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)圓形waveview,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
在Android中實(shí)現(xiàn)浮窗并添加吸邊效果的代碼示例
在 Android 中實(shí)現(xiàn)浮窗(懸浮窗)并添加吸邊效果,可以使用 WindowManager 來管理浮窗視圖,并通過觸摸事件來實(shí)現(xiàn)吸邊效果,以下是一個示例,展示如何創(chuàng)建一個浮窗并實(shí)現(xiàn)吸邊效果,需要的朋友可以參考下2025-02-02
Flutter利用Hero組件實(shí)現(xiàn)自定義路徑效果的動畫
本篇介紹了如何利用Hero動畫組件的createRectTween屬性實(shí)現(xiàn)自定義路徑效果的動畫。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-06-06
Android自定義webView頭部進(jìn)度加載效果
這篇文章主要介紹了Android自定義webView頭部進(jìn)度加載效果,小編畫一條進(jìn)度線,然后加載webview上面,具體實(shí)現(xiàn)代碼大家參考下本文2017-11-11
Android ListView實(shí)現(xiàn)單選及多選等功能示例
這篇文章主要介紹了Android ListView實(shí)現(xiàn)單選及多選等功能的方法,結(jié)合實(shí)例形式分析了ListView單選、多選及長按多選等功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08

