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();

执行后你会发现。不论你将图片放在哪里,都是原尺寸。

參考文档:

http://www.eoeandroid.com/blog-633294-2751.html

http://q.cnblogs.com/q/47175/

时间: 2024-11-08 08:58:49

Bitmap通过getWidth和getHeight获取尺寸不符的相关文章

Android中的PopupWindow中getWidth、getHeight为0或者-2

在Android开发中,需要用到PopupWindow这个类.在初始化完成,显示之前,都需要获得这个对象的width,height去计算popupWindow弹出的位置. 这个时候会发现取得的width和height都是-2:使用popupWindow.getContentView().getMeasuredWidth()和popupWindow.getContentView().getMeasuredHeight()取得的值都是0.如下面的代码: activity_main.xml 1 <?x

(转)Android getwidth()和getheight()已经过时使用point代替

转自:http://blog.csdn.net/ypq374563453/article/details/22819947 获取屏幕宽高4.0中直接使用getwidth()和getheight()已经过时使用point替代用法是 //屏幕宽高 Display display = getWindowManager().getDefaultDisplay(); Point size = newPoint(); display.getSize(size); width = size.x; height

常用的一些获取尺寸的方法

今天,我们来说一个比较小的点,但也是比较常用的知识点,就是获取尺寸的方法. 首先,我们先来说一下获取可视区的宽度,但前提你要知道什么是可视区,就是我们现在双眼所看的这个界面,当然不包括滚动条拉下去之后的啦, 接下来我们说一下方法: //获取可视区的宽度 document.documentElement.clientWidth; //获取可视区的高度 document.documentElement.clientHeight; 那如果你还不理解的话,我们来个比较官方的说法:clientWidth和

[[UIScreen mainScreen] bounds]获取尺寸不对

我在使用Xcode6时手动创建ViewController时也遇到了这样的问题,后来发现是因为项目设置中的Launch Images Source没有设置好的原因.因为把Xcode6自动生成的LaunchScreenController.xib删除了, 项目设置中的LaunchImages Source选项变成了 Use Asset Catalog,这时又没有指定正确的Images所以尺寸就不对了.解决办法是在Images.xcassets中创建LaunchImage,并将它做为Launch I

添加到界面前获取尺寸

You have few options you can do this, forcing to call Window.Measure and Window.Arrange will make all values to be calculated, or you can get those values in the Window.Loaded event. This same issue is discussed already on this question. If you are s

BitmapFactory.Options详解 怎样获取图片的大小 遇到大一些的图片,遇到OOM(Out Of Memory)的问题

下面我们回到我们的主题上来:怎样获取图片的大小? 思路很简单: 首先我们把这个图片转成Bitmap,然后再利用Bitmap的getWidth()和getHeight()方法就可以取到图片的宽高了. 新问题又来了,在通过BitmapFactory.decodeFile(Stringpath)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题.怎么避免它呢? 这就用到了我们上面提到的BitmapFactory.Options这个类. Bitmap

Android图片异步加载框架Universal Image Loader的源码分析

项目地址:https://github.com/nostra13/android-universal-image-loader 1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL. 简单的说 UIL 就做了一件事--获取图片并显示在相应的控件上. 1.2 基本使用 1.2.1 初始化 添加完依赖后在Application或Activity中初始化I

前端数据可视化echarts.js使用指南

一.开篇 首先这里要感谢一下我的公司,因为公司需求上面的新颖(奇葩)的需求,让我有幸可以学习到一些好玩有趣的前端技术,前端技术中好玩而且比较实用的我想应该要数前端的数据可视化这一方面,目前市面上的数据可视化的框架琳琅满目,例如:D3.js.hightcharts.js.echarts.js………….由于公司对这个项目的需求是1.开发时间短,所以也就限制了D3.js的使用.2.要尽量的减少开发的成本,所以也就不能使用hightcharts.js(hightcharts是一款个人免费,商业付费的框架

android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

首先我们还是看一些示例:(网易,新浪,百度) 显示效果都不错,可是手感就不一样了,百度最棒,网易还行,新浪就操作很不好,这里我说的是滑动切换图片.自己可以测试一下.不得不说牛叉的公司确实有哦牛叉的道理. 下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下. 第一种:ViewFlipper+GestureDetector 主布局就是一个li