Android图片内存溢出处理

jopen 9年前

1.图片内存溢出

默认情况下,每个android程序的dailvik虚拟机的最大堆空间大小为16M
当加载的图片太多或图片过大时经常出现OOM问题
android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError


2.解决办法

    public Bitmap matrixBitmapSize(Bitmap bitmap, int screenWidth,                int screenHight) {            //获取当前bitmap的宽高            int w = bitmap.getWidth();            int h = bitmap.getHeight();                    Matrix matrix = new Matrix();            float scale = (float) screenWidth / w;            float scale2 = (float) screenHight / h;                    // 取比例小的值 可以把图片完全缩放在屏幕内            scale = scale < scale2 ? scale : scale2;                    // 都按照宽度scale 保证图片不变形.根据宽度来确定高度            matrix.postScale(scale, scale);            // w,h是原图的属性.            return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);        }                public Bitmap optionsBitmapSize(String imagePath, int screenWidth,                int screenHight) {                    // 设置解析图片的配置信息            BitmapFactory.Options options = new Options();            // 设置为true 不再解析图片 只是获取图片的头部信息及宽高            options.inJustDecodeBounds = true;            // 返回为null            BitmapFactory.decodeFile(imagePath, options);            // 获取图片的宽高            int imageWidth = options.outWidth;            int imageHeight = options.outHeight;            // 计算缩放比例            int scaleWidth = imageWidth / screenWidth;            int scaleHeight = imageHeight / screenHight;            // 定义默认缩放比例为1            int scale = 1;            // 按照缩放比例大的 去缩放            if (scaleWidth > scaleHeight & scaleHeight >= 1) {                scale = scaleWidth;            } else if (scaleHeight > scaleWidth & scaleWidth >= 1) {                scale = scaleHeight;            }            // 设置为true开始解析图片            options.inJustDecodeBounds = false;            // 设置图片的采样率            options.inSampleSize = scale;            // 得到按照scale缩放后的图片            Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);            return bitmap;        }