在Android中压缩图片到指定大小可以通过以下几种方法实现:
1. 质量压缩(Quality Compression)
通过调整Bitmap的压缩质量来减小文件大小,使用`Bitmap.compress()`方法。
java
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream); // 质量参数(0-100)
byte[] compressedData = outputStream.toByteArray();
特点:不改变图片尺寸,仅通过降低JPEG/PNG的压缩质量减小大小。
注意事项:质量参数过低会导致明显 artifacts(如JPEG的块状失真)。
2. 尺寸缩放(Resolution Scaling)
通过缩小图片的宽高减少像素数据量:
java
Bitmap scaledBitmap = Bitmap.createScaledBitmap(
originalBitmap,
targetWidth,
targetHeight,
true
);
计算缩放比例:可根据目标文件大小反推比例,例如原图4MB缩放到500KB,需先测试压缩比。
建议:结合`BitmapFactory.Options.inSampleSize`实现高效解码时缩放(避免内存浪费)。
3. 双重压缩策略
先缩放尺寸再调整质量:
java
// 第一步:缩放
Bitmap scaledBitmap = scaleBitmap(originalBitmap, 0.5f); // 缩放到50%
// 第二步:质量压缩
scaledBitmap.compress(Bitmap.CompressFormat.WEBP, 70, outputStream);
优势:WEBP格式比JPEG更高效,Android 4.0+支持。
4. 使用第三方库
Luban:参考微信的压缩算法,自动处理尺寸和质量。
gradle
implementation 'top.zibin:Luban:1.1.8'
Glide:加载时自动优化图片大小:
java
Glide.with(context).load(imageFile).override(800, 600).into(imageView);
5. 文件大小反馈循环
通过循环压缩逼近目标大小:
java
while (outputStream.size() > targetSizeKB * 1024 && quality > 10) {
outputStream.reset();
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
quality -= 5;
}
扩展知识
格式选择:
- JPEG:适合照片类有损压缩。
- PNG:适合带透明度的无损压缩。
- WEBP:Android 4.0+支持,同等质量下比JPEG小30%。
避免OOM:超大图建议使用`BitmapRegionDecoder`分块解码。
Exif处理:压缩后可能丢失方向信息,需通过`ExifInterface`手动保留。
每种方法需结合实际场景选择,建议优先测试质量与尺寸的平衡点。