安卓中压缩图片的核心目标是减少图片占用的存储空间或内存,常见方法包括:
Bitmap.createScaledBitmap()
缩放图片后,再压缩为指定格式。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; }
Bitmap.compress()
方法。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.with().load().apply()
。Glide.with(context) .load(imageUri) .override(800, 600) // 限制尺寸 .quality(70) // 压缩质量 .into(imageView);
方法 | 优点 | 缺点 |
---|---|---|
inSampleSize | 内存占用低,性能高效 | 可能丢失细节 |
手动缩放+质量压缩 | 灵活控制尺寸和质量 | 代码复杂,需手动管理内存 |
第三方库 | 一站式解决方案,功能丰富 | 依赖库体积可能较大 |
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()
保持比例缩放