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

解决Bitmap通过getWidth和getHeight获取尺寸不符的问题的更多相关文章

  1. android – 如何在屏幕方向上停止活动娱乐?

    我如何在屏幕方向上停止重新启动或调用create(),我想停止在屏幕方向上重新创建活动.在此先感谢请告诉我任何更好的解决方案,它真正创造了一个问题.就像在我的程序中我选择一些图片但在屏幕方向上图像消失,这就是为什么我想停止在屏幕方向上重新开始活动.解决方法在API13之前,configChanges属性screenSize有一个新值因此,如果您使用大屏幕,请确保在configChanges属性中添加screenSize:

  2. android将XML视图转换为Bitmap而不显示它

    我正在尝试为我的地图集群设置视图.我正在从XML膨胀视图并根据群集大小设置文本,我想显示该视图.在下面的代码中我得到一个空位图作为回报:在下面的代码中我得到第四行的空指针(布局参数):当将其更改为以下代码时,我得到的不是错误,但没有绘制任何内容:这是我的XML:解决方法您的cluster.getLayoutParams()可能为null.首先,您需要测量膨胀视图的宽度/高度,然后分配给它.做如下:

  3. 是否有可能在android中创建一个Bitmap数组

    我想创建一个位图数组.可能吗?如果是,那是声明Bitmap数组的方法.以及如何初始化它?谢谢解决方法你可以使用Arraylist:或者只是一个位图数组,如:不过要小心你的图像大小.如果你试图存储很多大图像,你可能会遇到一些麻烦.

  4. android – 将一个ImageView的Bitmap内容复制到anoher

    我这样做的方式:请注意,bmSrc2是可变的,即你可以将它粘贴在Canvas中,并在绘制它之前做任何你喜欢的事情.

  5. 如果用户已经远离它,AsyncTask如何仍然使用Activity?

    在Android上,您可以在单独的线程中工作,例如使用Runnable或AsyncTask.在这两种情况下,您可能需要在完成工作后完成一些工作,例如通过覆盖AsyncTask中的onPostExecute().但是,用户可能会在后台完成工作时离开或关闭应用程序.我的问题是:如果用户导航或关闭应用程序时会发生什么情况,而我仍然引用用户刚刚在我的AsyncTask中关闭的Activity?我的猜测是,一旦用户导航就应该销毁它,但是当我出于某种原因在设备上测试它时,我仍然可以在Activity上调用方法,即使它

  6. Android Bitmap Masking(Xfermode)背后留下不透明的黑色背景

    如何避免这种黑色不透明背景?

  7. android – 旋转位图导致outOfMemoryException

    我以这种方式旋转位图,在每个按钮上单击图像旋转90度我用很多图像试过这个,但是现在一个引起了OutOfMemoryError.有办法防止这种情况吗?

  8. Android:Bitmap:如何在Android中保存带绿色背景的画布?

    我正在使用Bitmap创建数字签名图像.在设备上存储签名时,只有签名存储在黑色背景中.我希望绿色背景与签名.这是我的Bitmap代码我可以在创建签名时看到绿色背景,但它保存在黑色背景上.请帮帮我,谢谢你解决方法@rahul你也可以在onDraw中使用它请检查我的代码的更新

  9. Android – 新的BitmapDrawable已弃用;替代Bitmap.createBitmap必须具有w / h&gt; 0

    我用过PopupWindow.使用此PopupWindow,我将BackgroundDrawable设置为空的BitmapDrawable.当我使用以下代码时,它会给出一个弃用的警告:所以我改成了:这给了我一个错误,即Bitmap的宽度和高度必须大于0.现在我使用:它有效.但是使用1×1像素的Bitmap而不是像我想要的那样完全空的Bitmap似乎有点不对.还有另一种实际使用空BitmapDrawable的方法,而不是1乘1像素吗?

  10. android – 将URI转换为Bitmap的问题(2014):

    谢谢.解决方法请从uri获取输入流开始意图得到结果}

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部