解决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);
 }
}

运行结果如下图所示:

这里尺寸和原图相同

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获取尺寸不符的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android双向选择控件DoubleSeekBar使用详解

    本文实例为大家分享了Android双向选择控件DoubleSeekBar的使用方法,供大家参考,具体内容如下 先看效果图 1.DoubleSlideSeekBar public class DoubleSlideSeekBar extends View { /** * 线条(进度条)的宽度 */ private int lineWidth; /** * 线条(进度条)的长度 */ private int lineLength = 400; /** * 字所在的高度 100$ */ private

  • Android 将本地资源图片转换成Drawable,进行设置大小操作

    前言: 因为项目中显示图片是用Picasso,设置placeholder和error图片的时候发现,本地图片的大小无法满足我的需求,需要先对图片大小改变再显示. Picasso的placeholder和error的参数也只有int resId和Drawable drawable 于是打算将改变过大小的Drawable传进入显示,咦,效果很满意! 整个过程的思路: 将本地图片(R.drawable.image)变成Drawable对象 将Drawable对象转换成Bitmap对象 将Bitmap对

  • 解决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 save

  • 基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)

    本文为大家分享了四个jquery图片常见操作,供大家参考,具体内容如下 1.关于图片大小的重绘,你可以在服务端来实现,也可以通过JQuery在客户端实现. $(window).bind("load", function() { // IMAGE RESIZE $('#product_cat_list img').each(function() { var maxWidth = 120; var maxHeight = 120; var ratio = 0; var width = $(

  • 解决vue组件props传值对象获取不到的问题

    先说问题,父组件利用props向子组件传值,浏览器 console 有这个值,但是获取不到内部的属性,困了我3个小时,真的** personal console 以下为原代码 1.home.vue(父组件)--personal是被传的参数 <!--子组件--> <form-picker class="form-picker" :personal="personal" > </form-picker> export default

  • 解决vue2 在mounted函数无法获取prop中的变量问题

    如下所示: props: { example: { type: Object, default() { }, }, }, watch: { example: function(newVal,oldVal){ // newVal 为改变后的值 // 继续要处理的事件 }, }, 使用watch 替代 mounted. 通过watch属性来响应数据的变化,当数据改变时执行异步操作. 总结 以上所述是小编给大家介绍的解决vue2 在mounted函数无法获取prop中的变量问题,希望对大家有所帮助,如

  • 解决Vue axios post请求,后台获取不到数据的问题方法

    最近做项目,需要用到vue,后台是php,第一次使用axios进行请求,本以为同ajax一样,会很简单,但是结果往往不让人满意啊,get请求很简单,这里就不说了,主要说下 post请求方式. 使用axios进行post请求,后台居然接收不到数据,这就纳闷了,于是网上一顿搜索,现在将所用的解决办法给大家说下: 1.new URLSearchParams方式 起初使用params.append("属性名":属性值)的方式,对于简单的数据传递这样是没有问题的,后台可以正常接收数据,但我发现一

  • 解决python 执行shell命令无法获取返回值的问题

    问题背景:利用python获取服务器中supervisor状态信息时发现未能获取到返回值. python获取执行shell命令后返回值得几种方式: # 1.os模块 ret = os.popen("supervisorctl status") ret_data = ret.read() # 2.subprocess模块 ret = subprocess.Popen('supervisorctl status',shell=True,stdout=subprocess.PIPE) out

  • 解决iis7.5服务器上.net 获取不到https页面的信息

    我的获取页面需要cookie,不需要的可以去掉: GET的方法: 复制代码 代码如下: /// <summary>        /// 获取URL访问的HTML内容 获取https 页面的        /// </summary>        /// <param name="Url">URL地址</param>        /// <returns>HTML内容</returns>        publ

  • 解决Vue中mounted钩子函数获取节点高度出错问题

    遇到的问题 最近在开发一个Vue的项目,好几个页面都有用到一个 页面楼层滑动的组件,我就直接封装成了一个,但是遇到一个bug,就是我需要得到这个组件的offsetTop,然后页面滚动到这个位置的时候,就设置position属性为fixed,让他固定在屏幕上.问题是当我在mounted钩子函数中获取offsetTop的时候,在新开的页签中打开页面,会得到错误的offsetTop,但是在当前页面刷新,就不会有问题. 定位问题 后来查到问题,就是加载的问题,新窗口打开图片,默认是没有带缓存的,图片是G

  • android BitmapFactory.Options使用方法详解

    BitmapFactory.Options的使用是在加载图片时,就从图片的加载和使用说起  怎样获取图片的大小? 首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了. 新问题又来了,在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题.怎么避免它呢? 这就用到了我们上面提到的Bitmap

  • 100行Android代码轻松实现带动画柱状图

    为何要用带动画的柱状图呢? 最近,项目中遇到一个地方,要用到柱状图.所以这篇文章主要讲怎么搞一个柱子.100行代码,搞定柱状图! 圆角,头顶带数字.恩,这样用drawable也可以搞定.但是,这个柱子是有一个动画的,就是进入到界面的时候柱子不断的长高.这样的话,综合考虑还是用自定义View来做比较简便.效果如下图了: 完整Demo地址请到我的github下载地址: https://github.com/lixiaodaoaaa/ColumnAnimViewProject 关于尺寸 控件尺寸直接来

随机推荐