一:图片OOM异常:

代码示例:

public class MainActivity extends Activity {
private ImageView iv_imageView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_imageView = (ImageView) findViewById(R.id.Iv_imageView);
}
public void load(View view){
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1.jpg");
iv_imageView.setImageBitmap(bitmap);
}
}

出现问题:

解析问题:

一:图片明明就:1.37MB(1,444,582字节),为什么vm为16MB还会报错-->OOM?

1.图片要想被加载到内存中显示,在内在中是以数组的方式保存的,用数组表示图片中的每一个像素,

2.这个图片虽然只有1.37MB,但其分辨率为:2592*1944=5038848,即在内存中要表示这么多个点!

3.每个点都是有颜色的,RGB,所以每表示一个颜色,至少需要3个Byte来表示!

4.图片支持都有透明度的,图片的每个点都有一个参数&(0-255),1个字节,所以要表示一个点,需要四个Byte!

5.5038848*4=20155392Byte ---> 20155392/1024=19683KB  ---> 19638/1024=19.2216796875MB,即要将那个1.37MB的图片表示在计算机内存中,需要19.2216796875MB的内存,大于VM Heap:16MB,故OOM!

6.所以图片要显示在手机内存中要进行相应的处理,不能直接显示原图!一般所建的模拟器屏幕也就320*480,即只能表示这么多的像素。所以原图的每个点不能完全显示在手机的屏幕上!所以将图片依据手机屏幕做相应的缩放

二:对图片进行缩放的算法:

1.获取手机屏幕的分辨率:宽,高:320*480

2.获取图片的宽高信息:2592*1944

3.计算图片的缩放比例:

水平方向:2592/320=8.1

竖直方向:1944/480=4.05

4.确定显示的缩放比例:取大的一方(否则显示不全!)9.1

5.缩放完毕后,加载显示图片

详细代码:

public class MainActivity extends Activity {

	private ImageView iv_imageView;
private int windowWidth;
private int windowHeight;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_imageView = (ImageView) findViewById(R.id.Iv_imageView); //1.获取手机屏幕的分辨率 宽高
Display display = getWindowManager().getDefaultDisplay();
windowWidth = display.getWidth();
windowHeight = display.getHeight();
System.out.println("屏幕的宽度:" + windowHeight);
System.out.println("屏幕的高度:" + windowHeight);
}
public void load(View view){
// Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1.jpg");
// iv_imageView.setImageBitmap(bitmap);
Options opts = new Options();
//2.0设置解析器不去真正的解析这个位图,而是解析这个图片的out输出信息(宽度,高度),不会为图片的每个点申请内在空间
opts.inJustDecodeBounds = true;
//2.得到图片的宽高信息
BitmapFactory.decodeFile("/sdcard/1.jpg",opts);
int picHeight = opts.outHeight;
int picWidth = opts.outWidth;
System.out.println("图片的宽度:" + picWidth);
System.out.println("图片的高度:" + picHeight); //3.得到缩放比例
int scaleX = picWidth/windowWidth;
int scaleY = picHeight/windowHeight;
System.out.println("水平缩放比例:" + scaleX);
System.out.println("竖直缩放比例:" + scaleY); //3.2. 确定缩放比例:
int scale = 1;
if(scaleX > scaleY && scaleY>1){
scale = scaleX;
}
if(scaleY > scaleX && scaleX>1){
scale = scaleY;
} System.out.println("最终确定的缩放比例:" + scale); //4.真正的解析这个图片
opts.inJustDecodeBounds = false;
opts.inSampleSize = scale; Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1.jpg",opts);
iv_imageView.setImageBitmap(bitmap);
}
}

运行时log:

09-29 16:05:37.715: I/System.out(23786): 屏幕的宽度:480

09-29 16:05:37.715: I/System.out(23786): 屏幕的高度:480

09-29 16:07:12.085: I/System.out(23786): 图片的宽度:2592

09-29 16:07:12.085: I/System.out(23786): 图片的高度:1944

09-29 16:07:12.105: I/System.out(23786): 水平缩放比例:8

09-29 16:07:12.115: I/System.out(23786): 竖直缩放比例:4

09-29 16:07:12.115: I/System.out(23786): 最终确定的缩放比例:8

此时图片能正确显示:

09-29 16:17:26.475: I/System.out(23786): 屏幕的宽度:320

09-29 16:17:26.475: I/System.out(23786): 屏幕的高度:320

09-29 16:17:33.336: I/System.out(23786): 图片的宽度:1280

09-29 16:17:33.336: I/System.out(23786): 图片的高度:1024

09-29 16:17:33.345: I/System.out(23786): 水平缩放比例:2

09-29 16:17:33.345: I/System.out(23786): 竖直缩放比例:3

09-29 16:17:33.345: I/System.out(23786): 最终确定的缩放比例:3

Android中的多媒体显示之图片缩放的更多相关文章

  1. Android中同一个ImageView中根据状态显示不同图片

    一般: if(条件1) { image.setBackground(R.id.xxx1); } else if (条件2) { image.setBackground(R.id.xxx2); } 实际 ...

  2. Android中高效的显示图片之一 ——加载大图

    在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图 ...

  3. Android中高效的显示图片之三——缓存图片

    加载一张图片到UI相对比较简单,如果一次要加载一组图片,就会变得麻烦很多.像ListView,GridView,ViewPager等控件,需要显示的图片和将要显示的图片数量可能会很大. 为了减少内存使 ...

  4. android多点触控自由对图片缩放

    在系统的相册中,观看相片就可以用多个手指进行缩放. 要实现这个功能,只需要这几步: 1.新建项目,在项目中新建一个ZoomImage.java public class ZoomImageView e ...

  5. [置顶] Android中使用Movie显示gif动态图

    转载请注明:  http://blog.csdn.net/u012975705/article/details/48717391 在看这篇博文之前对attr自定义属性还是不是很熟的童鞋可以先看看:An ...

  6. 【有人@我】Android中高亮变色显示文本中的关键字

    应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...

  7. android中Canvas使用drawBitmap绘制图片

    1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置     drawBitmap(Bitmap bitmap, float left, float ...

  8. Android中高亮变色显示文本中的关键字

    应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...

  9. Android中高效的显示图片之二——在非UI线程中处理图片

    在“加载大图”文章中提到的BitmapFactory.decode*方法,如果源数据是在磁盘.网络或其它任何不是在内存中的位置,那么它都不应该在UI线程中执行.因为它的加载时间不可预测且依赖于一系列因 ...

随机推荐

  1. <blockquote>标签,长文本引用

    <blockquote>的作用也是引用别人的文本.但它是对长文本的引用,如在文章中引入大段某知名作家的文字,这时需要这个标签. 等等,上一节<q>标签不是也是对文本的引用吗?不 ...

  2. spring 4 xxx 与jackson-dataformat.xxx类冲突

    这段时间,做一个新的工作流的开发,在开始之初,用的jbpm,后来发现jbpm现在开发有问题,不能引用官方的工作空间,所要工作流跑不起来,于是用了activiti工作流,在配置spring和activi ...

  3. 带计时器的做题器(gui

    新学 1 JCheckBox chckbxA = new JCheckBox("a"); JCheckBox的监听器接口ItemListener,响应方法itemStateChan ...

  4. ASP.Net MVC4排序检索分页的实现

    前言 上一节我们做到了如下的一个基础查询页面.本节我们向这个页面中加入排序.搜索和分页功能. 排序 从上图中的地址栏中可以看到这个页面调用的是Company Controller下的Index Act ...

  5. underscorejs-some学习

    2.11 some 2.11.1 语法: _.some(list, predicate, [context]) 2.11.2 说明: 对list集合的每个成员根据predicate进行真值检测,如果一 ...

  6. jQuery 知识积累

    1.select下拉框设置选中项 //设置下拉框第一项为选中项$("#selectId option:first").prop("selected", 'sel ...

  7. 如何用angularjs制作一个完整的表格之二__表格分页功能

    接上一次,这次主要介绍表格分页功能,由于项目需要这个案例是关于前端分页的方式,现在很少会这么用了,但如有需要可以参考其中的思路 html: 1.通过UL来展示页标,其中每个页标的li是通过异步加载从获 ...

  8. localstorage || globalStorage || userData

    globalStorage 这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k.和 ...

  9. int string convert

    C++ int与string的转化 int本身也要用一串字符表示,前后没有双引号,告诉编译器把它当作一个数解释.缺省 情况下,是当成10进制(dec)来解释,如果想用8进制,16进制,怎么办?加上前缀 ...

  10. iOS常用动画-b

    CoreAnimationEffect.h //  CoreAnimationEffect // //  Created by VincentXue on 13-1-19. //  Copyright ...