解決Bitmap通過(guò)getWidth和getHeight獲取尺寸不符的問(wèn)題
在使用BitmapFactory加載圖片時(shí),常會(huì)出現(xiàn)這種情況,返回的圖片尺寸與實(shí)際尺寸不符。這是由于我們把圖片資源放到res/drawable文件路徑下時(shí),選擇的文件不同所致,不同的文件夾會(huì)有不同的縮放。
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,對(duì)于mdpi(density=160)設(shè)備,1dp=1px,對(duì)于hdpi(density=240)的設(shè)備,1dp=1.5px。所以,把圖片放在了res/drawable-mdpi目錄下,而運(yùn)行的Android設(shè)備屏幕屬于hdpi,導(dǎo)致圖片尺寸會(huì)擴(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)行后你會(huì)發(fā)現(xiàn),不論你將圖片放在哪里,都是原尺寸。
補(bǔ)充知識(shí):Android 獲取drawable中圖片的高度寬度
1.定義一個(gè)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.獲取每個(gè)圖片的高度寬度并保存數(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通過(guò)getWidth和getHeight獲取尺寸不符的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter如何完成路由攔截,實(shí)現(xiàn)權(quán)限管理
本篇介紹了利用 Fluro 路由管理實(shí)現(xiàn)路由權(quán)限攔截的兩種方式,兩種方式各有好處,使用過(guò)程中可以根據(jù)實(shí)際情況決定使用哪一種方法。2021-06-06一分鐘快速定位Android啟動(dòng)耗時(shí)問(wèn)題
做開發(fā)除了實(shí)現(xiàn)功能,還要注重優(yōu)化,性能優(yōu)化包括的東西還是非常多的,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)一分鐘快速定位Android啟動(dòng)耗時(shí)問(wèn)題的相關(guān)資料,需要的朋友可以參考下2021-07-07Kotlin ViewModelProvider.Factory的使用實(shí)例詳解
這篇文章主要介紹了Kotlin ViewModelProvider.Factory的使用,在我們使用 ViewModel 的時(shí)候,我們會(huì)發(fā)現(xiàn),有的時(shí)候我們需要用到 ViewModelFactory,有的時(shí)候不需要2023-02-02Android四大組件:Activity/Service/Broadcast/ContentProvider作用示例
Android是一種基于Linux,自由及開放源代碼的操作系統(tǒng),Android分為四個(gè)層,從高層到底層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層和Linux內(nèi)核層,Android有四大基本組件:Activity、Service服務(wù)、BroadcastReceiver廣播接收器、Content Provider內(nèi)容提供者2023-11-11Android自定義方框EditText注冊(cè)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android自定義方框EditText注冊(cè)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android webView如何輸出自定義網(wǎng)頁(yè)
這篇文章主要介紹了Android webView如何輸出自定義網(wǎng)頁(yè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Android畢業(yè)設(shè)計(jì)備忘錄APP
這篇文章主要介紹了一個(gè)Android畢業(yè)設(shè)計(jì)備忘錄APP,它很小,但是功能很全,可實(shí)現(xiàn)添加、刪除、修改、查看的功能,使用Java語(yǔ)言開發(fā),風(fēng)格簡(jiǎn)練2021-08-08