今天做了个小项目,使用ImageView控件显示一张20M大图片,用BitmapFactory.decodeResources()方法可以获得图片资源,但是在模拟器上运行会出错。出错代码如下:
网上查找解决方法,该问题为图片溢出(简单说图片太大了,手机运行不了)可以使用BitmapFactory.options类的decodeStream()方法解决,代码如下:
1 package com.example.localpicture; 2 3 import java.io.InputStream; 4 import android.net.Uri; 5 import android.os.Bundle; 6 import android.util.Log; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button; 10 import android.widget.ImageView; 11 import android.app.Activity; 12 import android.content.Intent; 13 import android.graphics.Bitmap; 14 import android.graphics.BitmapFactory; 15 16 public class LocalPicture extends Activity { 17 private Button button; 18 private ImageView image; 19 InputStream is; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_local_picture); 25 button = (Button) findViewById(R.id.button); 26 image = (ImageView) findViewById(R.id.imagView); 27 is = this.getResources().openRawResource(R.drawable.big); 28 button.setOnClickListener(new OnClickListener() { 29 @Override 30 //创建监听事件 31 public void onClick(View v) { 32 // TODO Auto-generated method stub 33 //获取手机屏幕大小 34 int dw = getWindowManager().getDefaultDisplay().getWidth(); 35 int dh = getWindowManager().getDefaultDisplay().getHeight(); 36 //读取图片的尺寸,按手机尺寸等比例缩小后读取图片资源 37 try { 38 BitmapFactory.Options options = new BitmapFactory.Options(); 39 //获取图片尺寸,不装载资源 40 options.inJustDecodeBounds = true; 41 Bitmap bitmap = BitmapFactory.decodeStream(is, null, 42 options); 43 int wRatio = (int) Math.ceil(options.outWidth / dw); 44 int hRatio = (int) Math.ceil(options.outHeight / dh); 45 if (wRatio > 1 || hRatio > 1) { 46 if (wRatio > hRatio) { 47 //将图片按wRatio:1比例缩小 48 options.inSampleSize = wRatio; 49 } else { 50 options.inSampleSize = hRatio; 51 } 52 } 53 //读取缩小后的图片资源 54 options.inJustDecodeBounds = false; 55 bitmap = BitmapFactory.decodeStream(is, null, options); 56 image.setImageBitmap(bitmap); 57 Log.d("test", "加载成功"); 58 59 } catch (Exception e) { 60 // TODO: handle exception 61 } 62 } 63 }); 64 } 65 66 }
好,运行项目,点击按钮,可以读取20M极端大图片按手机屏幕等比例缩小的图片:
![](https://i-blog.csdnimg.cn/blog_migrate/a718911bbf4f7d7685c6be4828e4e2a3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f5b4ebb38d5668f555d355e771182e95.png)
第一次写技术博客,写得不好,希望大牛别吐坏水。也希望园友可以和我交流学习。