安卓中压缩网络图片的核心目标是减少图片文件体积,同时尽量保持视觉质量,主要从以下维度进行优化:
方法 | 说明 | 适用场景 |
---|---|---|
Bitmap.compress() |
通过JPEG/PNG格式重新编码,指定压缩质量(0-100) | 后端返回高质量原图时 |
Luban 库 |
自动按比例压缩并生成不同规格图片 | 需要多尺寸适配时 |
示例代码逻辑:
// 将Bitmap压缩为JPEG,质量设为80 ByteArrayOutputStream baos = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); byte[] compressedData = baos.toByteArray();
关键API | 作用 | 注意点 |
---|---|---|
BitmapFactory.Options |
设置inSampleSize 进行采样率压缩 |
需在解码前计算合适比例 |
Matrix 缩放 |
通过矩阵变换强制缩放 | 可能导致模糊,慎用 |
采样率计算示例:
// 计算缩放比例(目标宽度/高度与原始值的较小比例) int reqWidth = 800; // 目标宽度 int reqHeight = 1200; // 目标高度 int originalWidth = options.outWidth; int originalHeight = options.outHeight; int sampleSize = Math.min(originalWidth/reqWidth, originalHeight/reqHeight);
格式 | 特点 | 压缩比 |
---|---|---|
WebP | 谷歌推出的新格式,支持透明度和动画 | 比JPEG小30-40% |
HEIC | iOS主推格式,安卓4.0+部分支持 | 压缩率更高但兼容性差 |
使用WebP注意事项:
libwebp
库支持优化手段 | 实现方式 |
---|---|
GZIP压缩 | 服务器配置启用GZIP |
OkHttp缓存 | 配置Cache-Control头 |
渐进式加载 | 优先显示模糊轮廓再逐步清晰 |
库名称 | 功能特性 | 适用场景 |
---|---|---|
Glide | 自动内存缓存+磁盘缓存,支持Resize/CenterCrop | 通用场景首选 |
Picasso | 支持placeholder占位图,自带内存管理 | 简单需求快速集成 |
Luban | 多线程压缩,生成多规格图片 | 需要多种尺寸适配时 |
Fresco | Facebook开源,支持GIF/WebP动图 | 复杂动效需求 |
分级压缩策略:
内存管理:
bitmap.recycle()
BitmapPool
复用对象LargeHeap=true
(谨慎使用)缓存策略:
| 缓存类型 | 存储位置 | 容量建议 |
|———-|———-|———-|
| LruCache | 内存 | ≤30MB |
| DiskLruCache | 存储卡/数据分区 | ≤100MB |
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 只解析元数据 BitmapFactory.decodeResource(res, R.drawable.big_image, options); options.inSampleSize = calculateSampleSize(options, reqWidth, reqHeight); options.inJustDecodeBounds = false;
BitmapShader
抗锯齿处理A:采用分层策略:
PSNR
(峰值信噪比)评估画质损失。A:实施三级加载:
NetworkPolicyManager
限制后台加载流量