使用Bitmap.createScaledBitmap缩放后画质骤降,已设压缩质量100,如何优化?
优化Bitmap缩放画质的措施
针对480x480图片放大到512x512后画质下降的问题,可通过以下几点优化:
1. 启用缩放过滤
Bitmap.createScaledBitmap的最后一个参数设为true,开启双线性过滤,让放大后的像素过渡更平滑,减少锯齿感:
val resizedBitmap = Bitmap.createScaledBitmap( resized, 512, 512, true // 启用过滤 )
2. 优化解码配置
解码原图时指定高质量像素格式,避免解码阶段的画质损失:
val options = BitmapFactory.Options().apply { inPreferredConfig = Bitmap.Config.ARGB_8888 // 保留完整色彩通道 inScaled = false // 禁用默认缩放,确保解码原始像素 } val resized = BitmapFactory.decodeFile(file.absolutePath, options)
3. 使用Canvas+Paint实现更平滑的缩放
相比createScaledBitmap,用Canvas绘制并配置Paint的过滤参数,能获得更细腻的缩放效果:
val resizedBitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888) Canvas(resizedBitmap).apply { val paint = Paint().apply { isFilterBitmap = true isDither = true interpolation = Paint.Interpolation.BILINEAR // API 29+可改用BICUBIC,画质更优 } drawBitmap(resized, null, Rect(0, 0, 512, 512), paint) }
4. 改用无损WEBP压缩
Bitmap.CompressFormat.WEBP即使质量设为100仍属于有损压缩,改用无损格式彻底避免压缩损失:
resizedBitmap.compress(Bitmap.CompressFormat.WEBP_LOSSLESS, 0, it) // 注:WEBP_LOSSLESS的质量参数无意义,传0即可
整合后的完整函数
fun resizeImage(file: File) { val options = BitmapFactory.Options().apply { inPreferredConfig = Bitmap.Config.ARGB_8888 inScaled = false } val originalBitmap = BitmapFactory.decodeFile(file.absolutePath, options) originalBitmap?.let { bitmap -> val resizedBitmap = Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888) Canvas(resizedBitmap).apply { val paint = Paint().apply { isFilterBitmap = true isDither = true interpolation = Paint.Interpolation.BILINEAR } drawBitmap(bitmap, null, Rect(0, 0, 512, 512), paint) } file.outputStream().use { resizedBitmap.compress(Bitmap.CompressFormat.WEBP_LOSSLESS, 0, it) resizedBitmap.recycle() bitmap.recycle() // 回收原图Bitmap,避免内存泄漏 } } }
内容的提问来源于stack exchange,提问作者HavanaSun
相关产品推荐
相关产品推荐

