首页 > 系统 > Android > 正文

Android 图片压缩总结

2019-11-09 17:26:09
字体:
来源:转载
供稿:网友

转载自简书,原文地址:http://www.jianshu.com/p/213fc03d0665

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

Paste_Image.pngPaste_Image.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);


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表