Android 图片压缩的那些事
来源:互联网 发布:矩阵论 科学出版社 编辑:程序博客网 时间:2024/06/03 23:00
在项目开发中,图片压缩是一个很棘手的问题,根据需要不同,压缩质量也会不同。而且还有可能会出现OOM的情况,所以在这里记录一下图片压缩的几种方式和用法。
质量压缩
质量压缩就是在不改变原图的大小的情况下,对图片质量进行压缩。说白点,就是图片可能会有一些模糊。
进行质量压缩,需要以字节的形态进行:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);byte[] compress_datas = outputStream.toByteArray();BitmapFactory.decodeByteArray(compress_datas, 0, compress_datas.length)
这里需要注意几个问题
*Bitmap.CompressFormat.JPEG可以用Bitmap.CompressFormat.PNG但是这样达不到一个很好的压缩效果,因为以png读出的图片字节流会很大,比JPEG大几倍以上,所以不建议这么使用,还是要用JPEG
*quality是一个int值,可以取0-100,例如取80就是压缩80%。
*如果你使用的透底的png图片,用这种方式进行压缩,就会出现黑底
如下图:
大小压缩
大小压缩其实是比较常用的尤其是在压缩缩略图的时候
大小压缩有两种方式,但是都需要一个压缩比例,或压缩之后的宽高
假设我们希望压缩之后的宽高为scaleW,ScaleH
那么可以这样:
bitmap = Bitmap.createScaledBitmap(bitmap, scaledW, scaledH, true);
或者通过压缩比例
BitmapFactory.Options opt = new BitmapFactory.Options();opt.inSampleSize = 4InputStream is = getResources().openRawResource(resid);BitmapFactory.decodeStream(is, null, opt)
这样会实现大小上的压缩
这里需要注意的是
*采样率inSampleSize的取值只能是2的次方数(例如:inSampleSize=15,实际取值为8;inSampleSize=17,实际取值为16;实际取值会往2的次方结算),因此该方法不能精确的指定图片的大小
*这种压缩方式不会使透底图出现黑色背景,但是对于那种长条图不合适,可能会导致模糊,看不清,如果是长条的图可以选用上面提到过的质量压缩
色值压缩
还有一种压缩方式可能会被忽略,就是色值压缩,一般图片分为以下几种模式:
ALPHA_8,ARGB_4444,ARGB_8888,RGB_565
如果你用的是ARGB_8888的图片,我给你设置成RGB_565,当然图片会减小
设置方式:
BitmapFactory.Options opt = new BitmapFactory.Options();opt.inPreferredConfig = Bitmap.Config.RGB_565;
OOM问题
在读取图片的时候,如果图片过大,会导致OOM的问题
如果我们在解析之前就将图片进行了适当的压缩就不会出现OOM的Crash问题了
我们可以参考上面提到的大小压缩,置顶宽高比读入,也可以使用色值压缩
BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inSampleSize = 4opt.inPreferredConfig = Bitmap.Config.RGB_565; int id = R.drawable.logo; InputStream is = getResources().openRawResource(id);return BitmapFactory.decodeStream(is, null, null);
- Android 图片压缩的那些事
- 服务亿级图片压缩那些事
- android 的图片压缩
- Android 图片处理的那些事
- android 图片压缩的方法
- android压缩图片的方法
- android 图片压缩的方法
- Android中的图片的压缩
- android压缩图片的算法
- android的照相图片压缩
- Android 加载压缩的图片
- Android 关于图片的压缩
- Android Bitmap图片的压缩
- Android中图片的压缩
- android 相册选择图片 图片的压缩
- Linux下压缩解压的那些事
- 关于图片的那些事
- 简单实用的android 图片的压缩
- Linux centos 7下: 用 C 语言连接 MySQL数据库
- BZOJ 2938: [Poi2000]病毒 AC自动机
- oracle注解生成整形主键策略
- 汇编语言 写 Hello World
- idea 快捷键
- Android 图片压缩的那些事
- java 内存模型(堆和栈的区别)
- svn报错:svn: E155017: Checksum mismatch for
- apache 和 nginx 的区别
- Android中的ViewRootImpl类源码解析
- yum update时候出现Another app is currently holding the yum lock解决方法
- 关于java触发器的经验分享
- java 文件/文件夹 从一个路径拷贝到另一个路径
- Unity3D 优化 2 ( lua 实例化与内存变化)