Android 图片压缩的那些事

在项目开发中,图片压缩是一个很棘手的问题,根据需要不同,压缩质量也会不同。而且还有可能会出现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图片,用这种方式进行压缩,就会出现黑底
如下图:

Android 图片压缩的那些事_第1张图片
Paste_Image.png
Android 图片压缩的那些事_第2张图片
Paste_Image.png

大小压缩

大小压缩其实是比较常用的尤其是在压缩缩略图的时候
大小压缩有两种方式,但是都需要一个压缩比例,或压缩之后的宽高
假设我们希望压缩之后的宽高为scaleW,ScaleH
那么可以这样:

bitmap = Bitmap.createScaledBitmap(bitmap, scaledW, scaledH, true);

或者通过压缩比例

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inSampleSize = 4
InputStream 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 = 4
opt.inPreferredConfig = Bitmap.Config.RGB_565; int id = R.drawable.logo; InputStream is = getResources().openRawResource(id);return BitmapFactory.decodeStream(is, null, null);

*更多的开发知识,可以关注我的公众号:

Android 图片压缩的那些事_第3张图片
Paste_Image.png

你可能感兴趣的:(Android 图片压缩的那些事)