一:图片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. Cacti以MB为单位监控流量

    Cacti自带的流量监控阀值模板为“Interface – Traffic”,只能监控bytes,在添加阀值之后,报警的流量信息以bytes为单位,查看很不友好,可以通过以下方法将btyes转换成MB ...

  2. python下 help()使用方法

    查看python所有的modules:help("modules") 单看python所有的modules中包含指定字符串的modules: help("modules ...

  3. JS 日常

    判断一个字符串是否在另一个字符串里面 var str = 'bblText'; if(str.indexOf("Text") > 0)  alert("包含了Tex ...

  4. jquery easy ui 学习 (7) TreeGrid Actions

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. Python报错:SyntaxError: Non-ASCII character '\xe5' in file的解决方法

    SyntaxError: Non-ASCII character '\xe5' in file 原因:Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他的 ...

  6. net Random 随机数重复的问题

    在实际项目中不仅需要随机产生密码字符串,还要一次生成多个.我把生成随机字符串的方法放到for循环中,问题出现了. 生成的字符串,会重复. 经过多方查证,原因在代码. //使用与系统时间相关的种子 Ra ...

  7. ROS是Robot Operating System

    ROS是Robot Operating System 机器人操作系统ROS | 简介篇   同样,从个人微信公众号Nao(ID:qRobotics)搬运. 前言 先放一个ROS Industrial一 ...

  8. Hadoop 学习笔记(二) HDFS API

    4.删除HDFS上的文件 package proj; import java.io.IOException; import org.apache.hadoop.conf.Configuration; ...

  9. Oracle除替换去掉换行符的方法

    特殊符号ascii定义 : 换行符和回车符都要干掉. 制表符 chr(9) 换行符 chr(10) 回车符 chr(13) select replace(replace(列名,CHR(10),''), ...

  10. Json 处理datetime

    json怎么处理datetime类型 http://hi.baidu.com/culion/item/428df54bf36762aede2a9ff1