android加载大图片到内存
16lz
2021-01-24
在andorid编程中,我们有时需要讲一张像素很高的图片加载的图片中,如果我们是这样去做
public void load1(View view) {String src = "mnt/sdcard/DSC.jpg";Bitmap bitmap = BitmapFactory.decodeFile(src);this.iv_img.setImageBitmap(bitmap);}
可能就是抛出 java.lang.OutOfMemoryError异常
这是由于在android系统中,默认情况下,dailvike虚拟机只会为每个应用程序分配16M的内存空间
而加载高像素的图片是非常消耗内存的,如果这时我们不将图片进行缩放就直接加载到内存,很容易就会抛出内存泄漏的异常
因此,我们可以这么来操作
public class MainActivity extends Activity {private ImageView iv_img;private int windowHeight;private int windowWidth;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.iv_img = (ImageView) this.findViewById(R.id.iv_img);WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);// 第一种获取手机屏幕宽高的方法this.windowHeight = manager.getDefaultDisplay().getHeight();this.windowWidth = manager.getDefaultDisplay().getWidth();System.out.println("手机宽 :" + this.windowWidth);System.out.println("手机高 :" + this.windowHeight);// 第二种获取手机屏幕宽高的方法,但是getSize()是从 API Level 13才有的方法// Point outSize = new Point();// manager.getDefaultDisplay().getSize(outSize );// this.windowWidth = outSize.x;// this.windowHeight = outSize.y;}public void load1(View view) {String src = "mnt/sdcard/DSC.jpg";Bitmap bitmap = BitmapFactory.decodeFile(src);this.iv_img.setImageBitmap(bitmap);}public void load2(View view) {String src = "mnt/sdcard/DSC.jpg";// 图片解析的配置Options options = new Options();// 不去真正解析图片,只是获取图片的宽高options.inJustDecodeBounds = true;BitmapFactory.decodeFile(src, options);int imageWidth = options.outWidth;int imageHeight = options.outHeight;System.out.println("图片宽 :" + imageWidth);System.out.println("图片高 :" + imageHeight);int scaleX = imageWidth / this.windowWidth;int scaleY = imageHeight / this.windowHeight;int scale = 1;if (scaleX >= scaleY && scaleX >= 1) {// 水平方向的缩放比例比竖直方向的缩放比例大,同时图片的宽要比手机屏幕要大,就按水平方向比例缩放System.out.println("按宽比例缩放");scale = scaleX;} else if (scaleY >= scaleX && scaleY >= 1) {// 竖直方向的缩放比例比水平方向的缩放比例大,同时图片的高要比手机屏幕要大,就按竖直方向比例缩放System.out.println("按高比例缩放");scale = scaleY;}System.out.println("缩放比例:" + scale);// 真正解析图片options.inJustDecodeBounds = false;// 设置采样率options.inSampleSize = scale;Bitmap bitmap = BitmapFactory.decodeFile(src,options);this.iv_img.setImageBitmap(bitmap);}}
简单的布局文件
进过缩放之后的图片再加载到内存,就不会再抛出异常。
更多相关文章
- android 不同drawable文件对应的dpi值,和所放图片分辨率
- 图库中选择图片出现异常Cursor为null
- 分享 Android(安卓)手机屏幕录制并制作成 GIF 演示图片
- Android给Gallery处于中间的图片加一个背景图片
- Android(安卓)Bitmap图片缩放优化,用canvas替代Matrix进行缩放,解
- Android(安卓)手绘 - 支持保存为图片
- Android加载大图和Lrucache 避免oom
- Android(安卓)textview字体颜色显示和图片显示
- Android-webview访问本地HTML5及本地HTML5之间的跳转