解决Bitmap通过getWidth和getHeight获取尺寸不符的问题

所属分类: 软件编程 / Android 阅读数: 73
收藏 0 赞 0 分享

在使用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);
 } 
}

运行结果如下图所示:

这里尺寸和原图相同

2、修改文件存放路径

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

这里尺寸放大了1.5倍

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

尺寸缩小了1.3倍

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

尺寸缩小了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(),imgRes[i],options);

//获取图片的宽高
int height = options.outHeight;
int width = options.outWidth;

以上这篇解决Bitmap通过getWidth和getHeight获取尺寸不符的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android实现信号强度监听的方法

这篇文章主要介绍了Android实现信号强度监听的方法,是Android手机中很常见的一个实用功能,需要的朋友可以参考下
收藏 0 赞 0 分享

Android实现Activity界面切换添加动画特效的方法

这篇文章主要介绍了Android实现Activity界面切换添加动画特效的方法,非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中Dialog去黑边的方法

这篇文章主要介绍了Android中Dialog去黑边的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Qt for Android开发实例教程

这篇文章主要介绍了Qt for Android开发的方法,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之时间日期操作实例

这篇文章主要介绍了Android开发之时间日期操作,是Android程序开发中常见的一个功能,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之时间日期组件用法实例

这篇文章主要介绍了Android开发之时间日期组件用法,主要介绍了TimePicker和DatePicker组件,对于Android程序开发有不错的借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之获取网络链接状态

这篇文章主要介绍了Android获取网络链接状态的方法,主要是通过ConnectivityManager类来完成的,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之广播机制浅析

这篇文章主要介绍了Android开发之广播机制浅析,主要包括了发布、接收及配置广播的实例,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之登录验证实例教程

这篇文章主要介绍了Android开发之登录验证实现方法,包括发送数据、服务器端验证、配置文件等,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发之注册登录方法示例

这篇文章主要介绍了Android开发的注册登录方法,是针对Android程序设计中版本兼容性的进一步完善,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多