前段时间,项目的一个需求涉及图片压缩之后上传。要求是压缩之后的图片要和原图尺寸一致,压缩后的大小控制在< 600KB,并且重新加载的时候不能卡顿更不能OOM,在此做一下记录。

质量压缩

使用方式:

public String compressAndImage(Bitmap image) throws IOException {ByteArrayOutputStream os = new ByteArrayOutputStream();//压缩比重,图片存储在磁盘上的大小会根据这个值变化。值越小存储在磁盘的图片文件越小,取值//区间为0-100,小于0时会抛异常int options = 100;image.compress(Bitmap.CompressFormat.JPEG, options, os);// Compress by loopwhile (os.toByteArray().length / 1024 > 500) {os.reset();if (options > 10) {options -= 10;image.compress(Bitmap.CompressFormat.JPEG, options, os);} else {options = 1;image.compress(Bitmap.CompressFormat.JPEG, options, os);break;}}File file = new File("图片路径");// Generate compressed image fileFileOutputStream fos = new FileOutputStream(file);fos.write(os.toByteArray());fos.flush();fos.close();return file.getAbsolutePath();
}

质量压缩图片的宽高不变,质量压缩的原理是通过改变图片的位深和透明度来减小图片占用的磁盘空间大小。但不会改变图片的像素点数,也就是说加载进内存的大小并没有改变,如果是大图加载还是会有OOM的风险。另外,png是无损压缩,所以设置Bitmap.CompressFormat.PNG无效。

采样率压缩

使用方式:

public Bitmap handleImageToBitmap() {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//此时只是为了获取当inJustDecodeBounds设置为true的时候,// BitmapFactory通过decodeResource或者decodeFile解码图片时,// 返回的Bitmap对象为null,这样可以避免Bitmap的内存分配,// 但是它可以获取Bitmap的宽度、高度BitmapFactory.decodeFile("文件路径", options);options.inJustDecodeBounds = false;//采样率,这个值决定了压缩后的图片大小options.inSampleSize = 2;return BitmapFactory.decodeFile("文件路径", options);
}

采样率压缩改变了图片的尺寸大小,减少了图片的像素点数,使得加载进内存的对象也变小了,当然对应图片保存到磁盘上所占空间也会变小。这些都取决于采样率的设定。一般这种压缩方式在做缩略图时用的较多。另附上做缩略图时,采样率(options.inSampleSize)的值设置方式:

public static int handleSampleSize(BitmapFactory.Options options, int aimsWidth, int aimsHeight) {int height = options.outHeight;//获取原始图片的高度int width = options.outWidth;//获取原始图片的宽度//inSampleSize小于等于1会按照1处理//inSampleSize只能设置为2的平方,不是2的平方则最终会减小到最近的2的平方数,如设置7会按4进行压缩。int inSampleSize = 1;//设置初始采样率if (height > aimsHeight || width > aimsWidth) {final int heightRatio = Math.round((float) height / (float) aimsHeight);final int widthRatio = Math.round((float) width / (float) aimsWidth);inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;}return inSampleSize;}

尺寸压缩

即通过压缩图片尺寸而改变图片的大小。

public static Bitmap zoomCompress(Bitmap bitmap) {Matrix matrix = new Matrix();matrix.setScale(0.5f, 0.5f);return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);
}

RGB_565压缩

在Android中,图片在内存是以Bitmap对象存在的,Bitmap所占内存计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数

图片的压缩格式共有以下四种:

ALPHA_8:表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444:表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888:表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565:表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

ARGB_4444压缩出来的画质很差,所以对透明度没有要求的话可以采用RGB_565的方式进行压缩:

public static Bitmap rgbCompress(String imgPath) {BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565;return BitmapFactory.decodeFile(imgPath, options);
}

也可以采用ARGB_8888,只不过压缩出来大小变化可能会很小。

第三方

鲁班压缩------接近微信朋友圈的压缩方法

放一张作者提供的效果对比图:

具体使用方法上面链接里有,就不多做叙述。这种方案适合那种,要求图片压缩后尺寸不变、体积要变小加载进内存的对象也要变小的需求,亲测效果还不错,而且压缩出来的图片也不会模糊,压缩出来的格式是JPEG

总结

使用每种压缩方式都要根据自己的需要来选择,有时候可能需要其中两种方式组合使用。对于第三方的选择上要慎重,毕竟使用第三方会增大apk的体积,能用系统提供的方法解决就尽量不用第三方。

最后如果文章有错误,请大家评论指正。希望我的分享能帮到大家!

参考文章:https://blog.csdn.net/harryweasley/article/details/51955467

Android 图片压缩方案相关推荐

  1. Android 图片压缩器

    概述 Android 图片压缩器:一款高效的图片压缩器库,支持批量压缩,异步压缩.多线程多任务压缩,压缩比设置等特性. 详细 代码下载:http://www.demodashi.com/demo/12 ...

  2. 最详细的Android图片压缩攻略

    Mr.Louis的博客地址: https://blog.csdn.net/weixin_44005563 最近在研究图片压缩原理,看了大量资料,从上层尺寸压缩.质量压缩原理到下层的哈夫曼压缩,走成华大 ...

  3. 可能是最详细的Android图片压缩原理分析(二)—— 鲁班压缩算法解析

    本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 稀土掘金链接 前言 通过上一篇,我们了解了一些关于图片压缩的基础知识,这篇文章我们主要讲解一下鲁班压缩的算法逻辑,很多博客都是从Gith ...

  4. 一款现代、高效的 Android 图片压缩框架

    本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上 ...

  5. 可能是最详细的Android图片压缩原理分析(一)—— Android图片压缩必备基础知识

    本篇文章已授权微信公众号guolin_blog(郭霖)独家发布 稀土掘金链接 前言: 最近在研究图片压缩原理,看了大量资料,从上层尺寸压缩.质量压缩原理到下层的哈夫曼压缩,走成华大道,然后去二仙桥,全 ...

  6. 最详细的Android图片压缩攻略,让你一次过足瘾

    /   今日科技快讯   / 近日,微软已经通知业务合作伙伴,将从明年开始上调Office办公套件逐月订购的价格,选择逐年订购服务的客户则不会受到影响. 微软宣布将于2022年推出Office全新企业 ...

  7. Android图片压缩(质量压缩和尺寸压缩)

    在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩):质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手 ...

  8. Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案

    1.Android一整套图片解决方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1& ...

  9. Android图片压缩尺寸和质量

    Android在处理图片时,如果不进行压缩处理,很容易就出现OOM内存溢出(OutOfMemory)问题,所以无论是第三方图片加载还是自己在处理图片时,都要进行压缩处理. Android系统中,一张图 ...

最新文章

  1. DDD CQRS架构和传统架构的优缺点比较
  2. 基于docker安装tensorflow
  3. 从零开始入门 K8s | 应用编排与管理:Job DaemonSet
  4. 【转】ZooKeeper原理及使用
  5. 小型数控雕刻机制作Arduino_开一家全屋定制装修公司,怎么选择开料机与雕刻机?...
  6. int f()与int f(void)的区别
  7. python3哪个版本稳定-python的哪个版本稳定
  8. linux 按时间查找文件,linux 文件三种时间 和 find 按时间查找
  9. 织梦插件,dede采集、发布、翻译伪原创插件
  10. 微信小程序button修改边框样式after
  11. 嵌入式单片机基础篇(十九)之一般TFTLCD 模块的使用流程
  12. html5校园生活,校园日常生活日记(精选12篇)
  13. 人民币对美元汇率中间价报6.7854元 下调80个基点
  14. win10改win7 bios设置方法
  15. 重视六大职场面试礼仪
  16. 7.2 一次产品异常复位引发的质量提升经历
  17. Go语言教程(二)Go语言基础编程
  18. 模拟DVD 实现录入 查看 借出 归还 删除 新增 等功能分层
  19. 阿里云研究员马涛:龙蜥社区做对了两件事
  20. Java实现手机发送短信验证码

热门文章

  1. thinkpad笔记本摄像头灯亮着,但无图像显示
  2. Less实战(五):函数(Functions)+ 注释(Comments)+ 导入(Importing)
  3. python微信图片dat转码(整理版)
  4. 图片基于base64转码技术
  5. fudge函数C语言,计算机本科C语言第九章讲.ppt
  6. android switch 未定义,源生Switch控件在Android4.4无法显示?
  7. php 万能仿站--孙琪峥
  8. 举世无双语音合成系统 VITS 发展历程(2023.03.31 SNAC)
  9. 读书笔记—《销售铁军》随记2
  10. MySQL之主键ID生成策略