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.    }    }
这样就能加载一张较大的图片了,运行如下:


更多相关文章

  1. android 将res内图片文件通过Bitmap对象存到手机本地中
  2. android 中.9图片的用法 详解
  3. android中使用ViewPager实现图片左右拖动
  4. Android中Bitmap内存占用分析
  5. Android(安卓)>> 27. Android(安卓)Studio 9-Patch 图片制作以及
  6. Android拍照或从系统相册获取图片
  7. Android(安卓)窗帘(Curtain)效果二之波浪式动态扭曲效果
  8. Android中的网络应用之网页设置,检测、配置用户设备属性。
  9. Android性能优化之三级缓存

随机推荐

  1. Android的Bluetooth Profile与UUID
  2. Android(安卓)Unable to find instrument
  3. android webview ERR_UNKNOWN_URL_SCHEME
  4. Android(安卓)Studio v1.0 项目无法运行
  5. android中的两端对齐
  6. Android(安卓)AIDL 理解及开发要点
  7. android 静默安装 卸载 资料汇总
  8. Android(安卓)Studio编译失败:Error: Invo
  9. 布局(2、相对布局)
  10. Android(安卓)系统音量最大值的定义位置