Android中的多媒体显示之图片缩放
一:图片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中的多媒体显示之图片缩放的更多相关文章
- Android中同一个ImageView中根据状态显示不同图片
一般: if(条件1) { image.setBackground(R.id.xxx1); } else if (条件2) { image.setBackground(R.id.xxx2); } 实际 ...
- Android中高效的显示图片之一 ——加载大图
在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图 ...
- Android中高效的显示图片之三——缓存图片
加载一张图片到UI相对比较简单,如果一次要加载一组图片,就会变得麻烦很多.像ListView,GridView,ViewPager等控件,需要显示的图片和将要显示的图片数量可能会很大. 为了减少内存使 ...
- android多点触控自由对图片缩放
在系统的相册中,观看相片就可以用多个手指进行缩放. 要实现这个功能,只需要这几步: 1.新建项目,在项目中新建一个ZoomImage.java public class ZoomImageView e ...
- [置顶] Android中使用Movie显示gif动态图
转载请注明: http://blog.csdn.net/u012975705/article/details/48717391 在看这篇博文之前对attr自定义属性还是不是很熟的童鞋可以先看看:An ...
- 【有人@我】Android中高亮变色显示文本中的关键字
应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...
- android中Canvas使用drawBitmap绘制图片
1.主要的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置 drawBitmap(Bitmap bitmap, float left, float ...
- Android中高亮变色显示文本中的关键字
应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...
- Android中高效的显示图片之二——在非UI线程中处理图片
在“加载大图”文章中提到的BitmapFactory.decode*方法,如果源数据是在磁盘.网络或其它任何不是在内存中的位置,那么它都不应该在UI线程中执行.因为它的加载时间不可预测且依赖于一系列因 ...
随机推荐
- <blockquote>标签,长文本引用
<blockquote>的作用也是引用别人的文本.但它是对长文本的引用,如在文章中引入大段某知名作家的文字,这时需要这个标签. 等等,上一节<q>标签不是也是对文本的引用吗?不 ...
- spring 4 xxx 与jackson-dataformat.xxx类冲突
这段时间,做一个新的工作流的开发,在开始之初,用的jbpm,后来发现jbpm现在开发有问题,不能引用官方的工作空间,所要工作流跑不起来,于是用了activiti工作流,在配置spring和activi ...
- 带计时器的做题器(gui
新学 1 JCheckBox chckbxA = new JCheckBox("a"); JCheckBox的监听器接口ItemListener,响应方法itemStateChan ...
- ASP.Net MVC4排序检索分页的实现
前言 上一节我们做到了如下的一个基础查询页面.本节我们向这个页面中加入排序.搜索和分页功能. 排序 从上图中的地址栏中可以看到这个页面调用的是Company Controller下的Index Act ...
- underscorejs-some学习
2.11 some 2.11.1 语法: _.some(list, predicate, [context]) 2.11.2 说明: 对list集合的每个成员根据predicate进行真值检测,如果一 ...
- jQuery 知识积累
1.select下拉框设置选中项 //设置下拉框第一项为选中项$("#selectId option:first").prop("selected", 'sel ...
- 如何用angularjs制作一个完整的表格之二__表格分页功能
接上一次,这次主要介绍表格分页功能,由于项目需要这个案例是关于前端分页的方式,现在很少会这么用了,但如有需要可以参考其中的思路 html: 1.通过UL来展示页标,其中每个页标的li是通过异步加载从获 ...
- localstorage || globalStorage || userData
globalStorage 这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k.和 ...
- int string convert
C++ int与string的转化 int本身也要用一串字符表示,前后没有双引号,告诉编译器把它当作一个数解释.缺省 情况下,是当成10进制(dec)来解释,如果想用8进制,16进制,怎么办?加上前缀 ...
- iOS常用动画-b
CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyright ...