上一篇
安卓图片压缩api
- 行业动态
- 2025-04-24
- 11
安卓图片压缩API可通过BitmapFactory.Options设置inSampleSize降低分辨率,或Bitmap.compress()调整质量参数实现体积缩减,也可集成Luban等第三方库进行高效压缩,需注意内存优化与异步
安卓图片压缩API详解
常用图片压缩方法
安卓中压缩图片的核心目标是减少图片占用的存储空间或内存,常见方法包括:
- 采样率压缩(inSampleSize)
通过降低图片采样率,直接生成缩小后的Bitmap。 - 质量压缩(Quality Compression)
将Bitmap转换为JPEG/PNG格式时,调整压缩质量参数。 - 手动缩放+格式转换
通过Bitmap.createScaledBitmap()
缩放图片后,再压缩为指定格式。 - 第三方库(如Glide、Picasso)
集成图片加载与自动压缩功能。
核心API与实现步骤
采样率压缩(inSampleSize)
- 原理:按比例缩小图片尺寸,减少内存占用。
- 关键API:
BitmapFactory.Options
的inSampleSize
属性。 - 步骤:
- 获取原始图片尺寸。
- 计算
inSampleSize
值(通常为2的幂次方)。 - 通过
BitmapFactory.decodeXXX()
加载缩小后的Bitmap。
int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { int width = options.outWidth; int height = options.outHeight; int inSampleSize = 1; while (width / 2 >= reqWidth && height / 2 >= reqHeight) { width /= 2; height /= 2; inSampleSize = 2; } return inSampleSize; }
质量压缩(JPEG/PNG)
- 原理:通过调整压缩质量参数,平衡文件大小与清晰度。
- 关键API:
Bitmap.compress()
方法。 - 步骤:
- 创建缩放后的Bitmap(可选)。
- 调用
compress()
方法,指定格式(JPEG/PNG)和质量(0-100)。
Bitmap bitmap = ...; // 原始或缩放后的Bitmap ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); // 质量80% byte[] compressedData = baos.toByteArray();
第三方库压缩(以Glide为例)
- 优势:自动处理图片缓存、压缩、裁剪等。
- 关键API:
Glide.with().load().apply()
。 - 示例:
Glide.with(context) .load(imageUri) .override(800, 600) // 限制尺寸 .quality(70) // 压缩质量 .into(imageView);
性能优化建议
方法 | 优点 | 缺点 |
---|---|---|
inSampleSize | 内存占用低,性能高效 | 可能丢失细节 |
手动缩放+质量压缩 | 灵活控制尺寸和质量 | 代码复杂,需手动管理内存 |
第三方库 | 一站式解决方案,功能丰富 | 依赖库体积可能较大 |
注意事项
- 内存溢出(OOM):
- 大图处理前先用
inSampleSize
缩小尺寸。 - 使用
Bitmap.recycle()
释放不再使用的Bitmap。
- 大图处理前先用
- 保持图片比例:
- 缩放时需计算宽高比例,避免变形。
int scaleWidth = originalWidth / reqWidth; int scaleHeight = originalHeight / reqHeight; int inSampleSize = Math.max(scaleWidth, scaleHeight);
- 缩放时需计算宽高比例,避免变形。
- 异步处理:
大图压缩应在子线程执行,避免阻塞主线程。
相关问题与解答
问题1:如何防止图片压缩时出现内存溢出?
解答:
- 使用
inSampleSize
预先缩小图片尺寸。 - 分阶段处理:先解码缩略图(
decodeFile()
),再按需加载原图。 - 及时调用
Bitmap.recycle()
回收内存。
问题2:如何保持图片压缩后的宽高比例?
解答:
- 计算原始宽高与目标宽高的比例,取最小值作为缩放系数。
int reqWidth = 800, reqHeight = 600; float scaleWidth = originalWidth 1.0f / reqWidth; float scaleHeight = originalHeight 1.0f / reqHeight; int inSampleSize = Math.round(Math.min(scaleWidth, scaleHeight));
- 使用
Matrix
或createScaledBitmap()
保持比例缩放