android图片压缩函数:

参考:http://104zz.iteye.com/blog/1694762

1. 按质量压缩:

private Bitmap compressImage(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();


//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中image.compress(Bitmap.CompressFormat.JPEG, 100, baos);


int options = 100;
//循环判断如果压缩后图片是否大于100kb,大于继续压缩
while ( baos.toByteArray().length / 1024>100) {

baos.reset();//重置baos即清空baos
//这里压缩options%,把压缩后的数据存放到baos中

image.compress(Bitmap.CompressFormat.JPEG, options, baos);
options -= 10;//每次都减少1

}


//把压缩后的数据baos存放到ByteArrayInputStream中
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());

//把ByteArrayInputStream数据生成图片

Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);


return bitmap;
}

2. 图片按比例大小压缩方法(根据路径获取图片并压缩):

private Bitmap getimage(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath,newOpts);//此时返回bm为空

newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = 800f;//这里设置高度为800f
float ww = 480f;//这里设置宽度为480f
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;//be=1表示不缩放
if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;//设置缩放比例
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

}

3. 图片按比例大小压缩方法(根据Bitmap图片压缩):

private Bitmap comp(Bitmap image) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
}
ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
BitmapFactory.Options newOpts = new BitmapFactory.Options();
//开始读入图片,此时把options.inJustDecodeBounds 设回true了
newOpts.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outWidth;
int h = newOpts.outHeight;
//现在主流手机比较多是800*480分辨率,所以高和宽我们设置为
float hh = 800f;//这里设置高度为800f
float ww = 480f;//这里设置宽度为480f
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = 1;//be=1表示不缩放
if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
be = (int) (newOpts.outWidth / ww);
} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
be = (int) (newOpts.outHeight / hh);
}
if (be <= 0)
be = 1;
newOpts.inSampleSize = be;//设置缩放比例
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
isBm = new ByteArrayInputStream(baos.toByteArray());
bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

}

更多相关文章

  1. Android有效解决加载大图片时内存溢出的问题
  2. Android 图片加载图片_OOM异常解决
  3. android实现服务器图片本地缓存
  4. Android SeekBar自定义使用图片和颜色显示
  5. RecyclerView item imageview 图片宽高自适应
  6. Android 微信分享,微信分享图片
  7. Android操作系统默认图片

随机推荐

  1. 网易千万级日活背后的系统运维技术支撑
  2. CDN加速原理
  3. 从入门到放弃,50G编程视频免费送!
  4. 探秘微服务治理之Spring Cloud Netflix E
  5. IPv4 没有用完!
  6. Fabric组织动态管理
  7. 2021-03-18:给定一个字符串str,只由‘X’和
  8. 混合云场景下金融级中间件自动化运维平台
  9. 终端安全发展
  10. 人生苦短,56岁的地产大佬潘石屹学 Python!