Android简易实战教程--第二十八话《加载大图片》
2016-09-07 08:49
281 查看
Android系统以ARGB表示每个像素,所以每个像素占用4个字节,很容易内存溢出。假设手机内存比较小,而要去加载一张像素很高的图片的时候,就会因为内存不足导致崩溃。这种异常是无法捕获的
内存不足并不是说图片的大小决定的,最主要的因素是像素问题。
因此加载大图片就要设置相应的缩放比例。
* 计算机把图片所有像素信息全部解析出来,保存至内存
* Android保存图片像素信息,是用ARGB保存
* 手机屏幕320*480,总像素:153600
* 图片宽高2400*3200,总像素7680000
* 算法:得到缩放比率
* 2400 / 320 = 7
* 3200 / 480 = 6
代码:
package com.itny.loadimage;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
//解析图片时需要使用到的参数都封装在这个对象里了
Options opt = new Options();
//不为像素申请内存,只获取图片宽高
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
//拿到图片宽高
int imageWidth = opt.outWidth;
int imageHeight = opt.outHeight;
Display dp = getWindowManager().getDefaultDisplay();
//拿到屏幕宽高
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
//计算缩放比例
int scale = 1;//表示默认不缩放
int scaleWidth = imageWidth / screenWidth;
int scaleHeight = imageHeight / screenHeight;
//哪个缩放比例大要哪个 >=防止缩放比例是一样的程序不执行这里
if(scaleWidth >= scaleHeight && scaleWidth >= 1){//scaleWidth >= 1 只缩放比屏幕像素大的图片
scale = scaleWidth;
}
else if(scaleWidth < scaleHeight && scaleHeight >= 1){
scale = scaleHeight;
}
//设置缩放比例
opt.inSampleSize = scale;
//这个时候有了缩放比了。因此要再一次为图片申请内存,使用BitmapFactory去解析位图
opt.inJustDecodeBounds = false;
//此时的Bitmap就是缩放后的Bitmap。
Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bm);//Sets a Bitmap as the content of this ImageView.
}
}
这样就能加载一张较大的图片了,运行如下:
内存不足并不是说图片的大小决定的,最主要的因素是像素问题。
因此加载大图片就要设置相应的缩放比例。
* 计算机把图片所有像素信息全部解析出来,保存至内存
* Android保存图片像素信息,是用ARGB保存
* 手机屏幕320*480,总像素:153600
* 图片宽高2400*3200,总像素7680000
* 算法:得到缩放比率
* 2400 / 320 = 7
* 3200 / 480 = 6
代码:
package com.itny.loadimage;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.view.Display;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
//解析图片时需要使用到的参数都封装在这个对象里了
Options opt = new Options();
//不为像素申请内存,只获取图片宽高
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
//拿到图片宽高
int imageWidth = opt.outWidth;
int imageHeight = opt.outHeight;
Display dp = getWindowManager().getDefaultDisplay();
//拿到屏幕宽高
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
//计算缩放比例
int scale = 1;//表示默认不缩放
int scaleWidth = imageWidth / screenWidth;
int scaleHeight = imageHeight / screenHeight;
//哪个缩放比例大要哪个 >=防止缩放比例是一样的程序不执行这里
if(scaleWidth >= scaleHeight && scaleWidth >= 1){//scaleWidth >= 1 只缩放比屏幕像素大的图片
scale = scaleWidth;
}
else if(scaleWidth < scaleHeight && scaleHeight >= 1){
scale = scaleHeight;
}
//设置缩放比例
opt.inSampleSize = scale;
//这个时候有了缩放比了。因此要再一次为图片申请内存,使用BitmapFactory去解析位图
opt.inJustDecodeBounds = false;
//此时的Bitmap就是缩放后的Bitmap。
Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bm);//Sets a Bitmap as the content of this ImageView.
}
}
这样就能加载一张较大的图片了,运行如下:
相关文章推荐
- Android简易实战教程--第二十八话《加载大图片》
- Android实战简易教程-第二十八枪(Uri转String型实例)
- Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)
- Android实战简易教程-第二十八枪(Uri转String型实例)
- Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)
- Android实战简易教程-第十七枪(LayoutAnimation布局动画)
- Android实战简易教程-第二枪(Spinner下拉级联效果)
- Android实战简易教程-第二十三枪(基于Baas的用户注册和登录模块实现!)
- Android实战简易教程-第十一枪(树形组件:ExpandableListView显示和动态添加删除)
- Android实战简易教程-第二十七枪(Android设置头像上传功能实现)
- Android实战简易教程-第十九枪(SwipeRefreshLayout下拉刷新使用实例)
- Android实战简易教程-第二十三枪(基于Baas的用户注册验证用户名是否重复功能!)
- Android实战简易教程-第四枪(ScrollView和HorizontalScrollView动态添加控件并提供事件监听)
- Android实战简易教程-第五枪(ListView用法研究)
- Android实战简易教程-第二十二枪(基于Baas的用户注册功能)
- Android实战简易教程-第九枪(BitmapFactory.Options对资源图片进行缩放)
- Android实战简易教程-第八枪(ImageSwitcher用法实例)
- Android实战简易教程-第十三枪(五大布局研究)
- Android实战简易教程-第十四枪(介绍SwipeMenuListView-简单实现类似QQ的滑动删除效果)