Android图片压缩的实例详解
发布时间 - 2026-01-11 02:51:16 点击率:次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 图片压缩的实现方法的详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android图片压缩
# Android
# 图片压缩的实例
# Android图片处理工具类BitmapUtils
# Android图片处理教程之全景查看效果实现
# Android图片选择器ImageEditContainer
# Android图片无限轮播的实现代码
# Android图片色彩变换实现方法
# Android选择与上传图片之PictureSelector教程
# 如有
# 加载
# 按比例
# 的是
# 都是
# 不起作用
# 很好
# 还可以
# 两种
# 希望能
# 第二个
# 还未
# 有两种
# 谢谢大家
# 太小
# 一定能
# 只对
# 则会
# 需要注意
# 有影响
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
大同网页,大同瑞慈医院官网?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
公司网站制作需要多少钱,找人做公司网站需要多少钱?
C语言设计一个闪闪的圣诞树
Laravel怎么为数据库表字段添加索引以优化查询
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel如何处理和验证JSON类型的数据库字段
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
重庆市网站制作公司,重庆招聘网站哪个好?
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
Laravel如何创建自定义中间件?(Middleware代码示例)
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
linux写shell需要注意的问题(必看)
网站建设要注意的标准 促进网站用户好感度!
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在建站主机中优化服务器配置?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
什么是javascript作用域_全局和局部作用域有什么区别?
Python并发异常传播_错误处理解析【教程】
C#如何调用原生C++ COM对象详解
如何正确下载安装西数主机建站助手?
如何快速生成高效建站系统源代码?
装修招标网站设计制作流程,装修招标流程?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
黑客如何利用漏洞与弱口令入侵网站服务器?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何实现事件和监听器?(Event & Listener实战)
如何彻底卸载建站之星软件?
,怎么在广州志愿者网站注册?
MySQL查询结果复制到新表的方法(更新、插入)
如何在局域网内绑定自建网站域名?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何打造高效商业网站?建站目的决定转化率
Laravel怎么使用Intervention Image库处理图片上传和缩放
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
深入理解Android中的xmlns:tools属性
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
如何在自有机房高效搭建专业网站?
在线教育网站制作平台,山西立德教育官网?
Android自定义listview布局实现上拉加载下拉刷新功能
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
详解阿里云nginx服务器多站点的配置

