您的位置:首页 > 移动开发 > Android开发

Android中对加载大图的处理

2015-11-01 23:09 501 查看
1.先看加载原理:Android中图片是以像素的形式加载到内存中。png、bmp、jpg等格式的图片(位图文件),都是以像素表述图片大小的。虚拟机的内存并不是无限的大,而是当前应用程序所能分配的内存。当图片的大小超过虚拟机内存的大小,就会出现OutOfMemoryError

2.如何解决?

a.思路: 把图片一相应的比例缩小,而不影响视觉效果。

代码如下:

public class ImageActivity extends Activity {

private EditText imageShow_et;
private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
imageView = (ImageView) findViewById(R.id.image_iv);
}

public void showImage(View view) {
// 1.图片解析的配置:
BitmapFactory.Options options = new Options();
options.inJustDecodeBounds = true;// 加载图片的时候,只获取该图片的属性,而不返回bitmap

// 2.获取图片的宽高信息
BitmapFactory.decodeFile(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath()
+ "/big.JPG", options);
int pictureWidth = options.outWidth;
int pictureHeight = options.outHeight;

// 3.获取手机屏幕的宽高
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display phoneDisplay = wm.getDefaultDisplay();
Point outSize = new Point();
phoneDisplay.getSize(outSize);
int screenWidth = outSize.x;
int screenHeight = outSize.y;

// 4.设置缩放比例:
int dx = pictureWidth / screenWidth;
int dy = pictureHeight / screenHeight;
int scale = 1;
if (dx > dy && dx > 1) {
scale = dx;
}
if (dy > dx && dy > 1) {
scale = dy;
}

// 5.设置图片的采样比例,对图片以缩放比例来显示图片
options.inSampleSize = scale;
options.inJustDecodeBounds = false;// 真的解析图拍了,并返回Bitmap

Bitmap bitmap = BitmapFactory.decodeFile(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath()
+ "/big.JPG", options);
imageView.setImageBitmap(bitmap);
}
}


b.用Google本身提供的一套解决方案BitmapFun,它可以解决加载图片慢,OOM的问题.其中的ImageFetcher就是根据图片三级缓存原理来处理图片:先在内存中找,内存中找不到再在文件中找,最后是网络查找。清理图片缓存的时候可以用DiskLruCache.clearCache,一键清除。

c. 还可以使用xUtils中专门针对图片的BitmapUtils。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OOM Bitmap 大图处理