Bitmap图片压缩

来源:互联网 发布:raft 算法 三副本 编辑:程序博客网 时间:2024/06/04 18:16
如果图片像素过大,使用BitmapFactory 类的方法实例化Bitmap 的过程中,需要大于8M 的内存空间,就必定会发生OutOfMemory 异常。这个时候该如何处理呢?如果有这种情况,则可以将图片缩小,以减少载入图片过程中的内存的使用,避免异常发生。
使用BitmapFactory.Options 设置inSampleSize 就可以缩小图片。属性值inSampleSize 表示缩略图大小为原始图片大小的几分之一。

即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大小就为原始大小的1/4。
如果知道图片的像素过大,就可以对其进行缩小。那么如何才知道图片过大呢?
使用BitmapFactory.Options 设置inJustDecodeBounds 为true 后,再使用
decodeFile()等方法,并不会真正的分配空间,即解码出来的Bitmap 为null,
但是可计算出原始图片的宽度和高度, 即options.outWidth 和
options.outHeight。通过这两个值,就可以知道图片是否过大了。
BitmapFactory.Options opts = new BitmapFactory.Options();
// 设置inJustDecodeBounds 为true
opts.inJustDecodeBounds = true;
// 使用decodeFile 方法得到图片的宽和高
BitmapFactory.decodeFile(path, opts);
// 打印出图片的宽和高
Log.d("example", opts.outWidth + "," + opts.outHeight);
在实际项目中,可以利用上面的代码,先获取图片真实的宽度和高度,然后判断是
否需要跑缩小。如果不需要缩小,
设置inSampleSize 的值为1。如果需要缩小,则动态计算并设置inSampleSize
的值,对图片进行缩小。需要注意的是,
在下次使用BitmapFactory 的decodeFile()等方法实例化Bitmap 对象前,别忘
记将opts.inJustDecodeBound 设置回false。否则获取的bitmap 对象还是null。
经验分享:
如果程序的图片的来源都是程序包中的资源,或者是自己服务器上的图片,图片的
大小是开发者可以调整的,那么一般来说,
就只需要注意使用的图片不要过大,并且注意代码的质量,及时回收Bitmap 对象,
就能避免OutOfMemory 异常的发生。
如果程序的图片来自外界,这个时候就特别需要注意OutOfMemory 的发生。一
个是如果载入的图片比较大,就需要先缩小;另一个是一定要捕获异常,避免程序Crash。
4.图片太大,进行压缩,BitMapFactory.Options 重新设置宽,高,像素。。。
package cn.itcast.androidtext;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
public class BitmapUtil {
/**
* 得到图片的缩略图
*
* @param pathName
* 路径
* @param reqWidth
* 宽
* @param reqHeight
* 高
* @return
*/
public static Bitmap decodeSampledBitmapFromFd(String pathName, int
reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathName, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
options.inJustDecodeBounds = false;
Bitmap src = BitmapFactory.decodeFile(pathName, options);
return createScaleBitmap(src, reqWidth, reqHeight);
}
// 如果是放大图片,filter 决定是否平滑,如果是缩小图片,filter 无影响
private static Bitmap createScaleBitmap(Bitmap src, int dstWidth, int
dstHeight) {
Bitmap dst = Bitmap.createScaledBitmap(src, dstWidth, dstHeight,
false);
if (src != dst) { // 如果没有缩放,那么不回收
src.recycle(); // 释放Bitmap 的native 像素数组
}
return dst;
}
private static int calculateInSampleSize(BitmapFactory.Options options, int
reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) > reqHeight && (halfWidth /
inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
/**
* 从Resources 中加载图片
*
* @param res
* @param resId
* @param reqWidth
* @param reqHeight
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res,
int resId, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options); // 读取图片长款
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight); // 计算inSampleSize
options.inJustDecodeBounds = false;
Bitmap src = BitmapFactory.decodeResource(res, resId, options); // 载
入一个稍大的缩略图
return createScaleBitmap(src, reqWidth, reqHeight); // 进一步得到目标
大小的缩略图
}
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四季梅叶子打卷花从粉变白怎么办 新移栽的竹子出来太细怎么办 土培富贵竹长得太高了怎么办 毛竹加工厂被环保查了该怎么办? 领养姐姐家的孩子怎么办领养手续 孩子喝了点杯子变质发霉的水怎么办 杯子发霉没洗干净喝了水怎么办 小孩的咪咪头没有突出来怎么办 手被竹子刺了肿了怎么办 紫竹刚栽叶子发枯怎么办能活吗 移栽大田的水稻过施了氮肥怎么办 股骨术后六十天有小量骨痂怎么办 被桃树上的蜂蜜咬了怎么办 照片回收站密码找不回来了怎么办 扣扣空间照片回收站密码忘了怎么办 我眼睛近视了不想戴眼镜怎么办 微信聊天对方只回一个字怎么办 大学室友都不是自己喜欢的人怎么办 超轻粘土粘在衣服上怎么办 粽子昨晚煮好今日发现不够熟怎么办 5岁宝宝左眼轻微散光怎么办光 孩子总吸鼻子但没有鼻涕怎么办 纹完眼线眼睛磨的很难受怎么办 我的脸型眼睛好看牙不好看怎么办 陌陌当日打招呼人数已达上限怎么办 新生婴儿白天睡觉晚上不睡怎么办 被有翅膀的蚂蚁咬了怎么办 被带翅膀的蚂蚁蛰了怎么办 被长翅膀的蚂蚁咬了怎么办 宝宝被带翅膀的蚂蚁咬了怎么办 新的小白鞋鞋子有点夹脚怎么办 单反快门按不下去里面响怎么办 在上海动漫城游戏厅里输了钱怎么办 电缝纫机扎快了上线有套那是怎么办 老式缝纫机底线总夹梭子上怎么办 两个月宝宝脸一边大一边小怎么办 炒股入金10万亏3万怎么办 如果一支股票有好几个庄家怎么办 浦发信用卡查询密码被锁定怎么办 浦发信用卡输错密码被锁定怎么办 浦发手机银行查询密码锁定怎么办