Android图片压缩的实例详解
时间:2022-07-27
本文章向大家介绍Android图片压缩的实例详解,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Android图片压缩的实例详解
在做微信分享的时候,由于分享的缩略图要求不得大于32K,否则不能调起微信,所以总结了一下Android图片的压缩问题,大部分资料都是来自网上各位的分享,自己只是完善或修改了一下,本着继续分享的精神,也方便自己记忆,于是总结如下。
android图片压缩主要有两种方式:1.压缩图片分辨率 2.压缩图片质量
一、先看压缩图片分辨率,很好理解,如本来1280*768的图片压缩为640*384大小。废话不说,直接上代码:
/**
* 按比例压缩图片分辨率
* @param inBitmap
* @param outHeight 输出图片高度,可据此保持比例计算输出宽度
* @param needRecycled 是否回收inBitmap
* @return
*/
public static Bitmap createScaledBitmapByOutHeight(Bitmap inBitmap, int outHeight, boolean needRecycled) {
int bitmapHeight = inBitmap.getHeight();
int bitmapWidth = inBitmap.getWidth();
int outWidth = bitmapWidth * outHeight / bitmapHeight;
return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled);
}
/**
* 按比例压缩图片分辨率
* @param inBitmap
* @param outHeight 输出图片宽度,可据此保持比例计算输出高度
* @param needRecycled 是否回收inBitmap
* @return
*/
public static Bitmap createScaledBitmapByOutWidth(Bitmap inBitmap, int outWidth, boolean needRecycled) {
int bitmapHeight = inBitmap.getHeight();
int bitmapWidth = inBitmap.getWidth();
int outHeight = bitmapHeight * outWidth / bitmapWidth;
return createScaledBitmap(inBitmap, outWidth, outHeight, needRecycled);
}
/**
* 指定输出的宽高缩放图片
* @param inBitmap
* @param outWidth
* @param outHeight
* @param needRecycled
* @return
*/
public static Bitmap createScaledBitmap(Bitmap inBitmap, int outWidth, int outHeight, boolean needRecycled) {
Bitmap thumbBmp = Bitmap.createScaledBitmap(inBitmap, outWidth, outHeight, true);
if (needRecycled) {
inBitmap.recycle();
}
return thumbBmp;
}
前两个方法可以指定期望的宽度或高度,并按比例缩放图片的分辨率,第3个方法可以随意指定期望的宽高,缩放图片。
上面代码是对输入的bitmap进行缩放,还可以从资源或文件中加载图片并缩放,具体如下:
/**
* 从资源加载并压缩图片
* @param res
* @param resId
* @param outWidth 目标宽度
* @param outHeight 目标高度
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int outWidth, int outHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 假解,来获取图片大小
BitmapFactory.decodeResource(res, resId, options);
options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
//options.inPreferredConfig = Config.RGB_565;
return BitmapFactory.decodeResource(res, resId, options);
}
/**
* 从文件中加载并压缩图片
* @param res
* @param resId
* @param outWidth 目标宽度
* @param outHeight 目标高度
* @return
*/
public static Bitmap decodeSampledBitmapFromFile(String pathName, int outWidth, int outHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 假解,来获取图片大小
BitmapFactory.decodeFile(pathName, options);
options.inSampleSize = calculateInSampleSize(options, outWidth, outHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
//options.inPreferredConfig = Config.RGB_565;
return BitmapFactory.decodeFile(pathName, options);
}
/**
* 计算options.inSampleSize
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height reqHeight || width reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
二、压缩图片的质量
/**
* 压缩图片质量,把图片压缩到outSize以内
* @param inBitmap 原始bitmap
* @param outSize 压缩到的大小
* @param needRecycled 是否回收bitmap
* @return
*/
public static Bitmap compressImage(Bitmap inBitmap, int outSize, boolean needRecycled) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
inBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
int quality = 100;
while (baos.toByteArray().length / 1024 outSize) {
if (quality <= 0) {
ByteArrayInputStream outBais = new ByteArrayInputStream(baos.toByteArray());
return BitmapFactory.decodeStream(outBais, null, null);// 如果quaLity为0时还未达到32k以内,返回得到的最小值;如需要可结合分辨率压缩
}
baos.reset();
//PNG格式下,这种压缩不起作用(quality:0-100,如果目标大小太小,有时候质量压缩不一定能达到效果,需结合分辨率压缩)
inBitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
Log.e("AN", "bitmap size:"+ baos.toByteArray().length / 1024 + "k");
quality -= 10;
}
if (needRecycled) {
inBitmap.recycle();
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
Bitmap outBitmap= BitmapFactory.decodeStream(bais, null, null);//ByteArrayInputStream转成bitmap
return outBitmap;
}
需要注意的是compress方法,该压缩方法只对JPEG格式有效,对于PNG格式,则会忽略第二个参数quality,即压缩不起作用。这种压缩只是对图片质量有影响,并不会改变图片大小。
当然,如有需要,以上两种压缩方法可以结合使用。
以上就是Android 图片压缩的实现方法的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
- 这些奇技浮巧,助你优化前端应用性能
- Stepping.js——两步完成前后端分离架构设计
- 我的职业是前端工程师【十】客户端存储艺术:数据存储与模型
- 【开源】2md:将复制的内容、网页转成 markdown
- React Native 持续部署实践— push 代码构建出新版的 Growth
- 技巧 - 如何好一个 Git 提交信息及几种不同的规范
- React、Vue、Ember 及其他前端开发者,请暂缓更新到 Chrome 59 浏览器
- 微软开源全新的文档生成工具DocFX
- 使用 MimeKit 和 MailKit 发送邮件
- 使用 React Native 重写大型 Ionic 应用后,我们想分享一下这八个经验
- 基于OWin的Web服务器Katana发布版本3
- 【工具推荐】图像界的魔术师 ImageMagick
- 使用Metrics.NET 构建 ASP.NET MVC 应用程序的性能指标
- 如何设计完善的构建系统,为日常开发提速一倍
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- React基础(9)-React中发送Ajax请求以及Mock数据
- 一个快速引入CDN的workflow
- 在Ryzen平台上安装macOS High Sierra苹果系统
- v-selectpage 基于Vue2的高清重制版
- Android Studio3.6中的View Binding初探及用法区别
- Android日志文件的读写工具类
- <Go语言学习笔记>【数组与切片】
- Android Studio 3.6 新特性一览(推荐)
- 03 Linux下的SVN服务器搭建
- Android openGl 绘制简单图形的实现示例
- 解决Android studio 3.6.1 出现Cause: unable to find valid certification path to requested target 报错的问题
- 使用kotlin实现MVP的方式(简单好用)
- Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解
- android studio更新gradle错误构建项目失败的解决方法
- Android Studio使用Kotlin时,修改代码后运行不生效的解决方法