大家可以看Coil2.0.0的更新日志,在2.0中Coil的作者把BlurTransformation移除了。
在2.0想实现高斯模糊的话就把BlurTransformation复制过来到我们的项目中。
这里我们复制2.0之前最新的一个版本1.4.0的BlurTransformation
注意复制的时候不要把包名改成我们自己的包名,就用 coil.transform这个包名。
当然有很多地方报红,修改好后的代码:
package coil.transform
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Paint
import android.renderscript.Allocation
import android.renderscript.Element
import android.renderscript.RenderScript
import android.renderscript.ScriptIntrinsicBlur
import androidx.core.graphics.applyCanvas
import androidx.core.graphics.createBitmap
import coil.size.Size
/**
* A [Transformation] that applies a Gaussian blur to an image.
*
* @param context The [Context] used to create a [RenderScript] instance.
* @param radius The radius of the blur.
* @param sampling The sampling multiplier used to scale the image. Values > 1
* will downscale the image. Values between 0 and 1 will upscale the image.
*/
class BlurTransformation @JvmOverloads constructor(
private val context: Context,
private val radius: Float = DEFAULT_RADIUS,
private val sampling: Float = DEFAULT_SAMPLING
) : Transformation {
init {
require(radius in 0.0..25.0) { "radius must be in [0, 25]." }
require(sampling > 0) { "sampling must be > 0." }
}
override val cacheKey = "${BlurTransformation::class.java.name}-$radius-$sampling"
override suspend fun transform(input: Bitmap, size: Size): Bitmap {
val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
val scaledWidth = (input.width / sampling).toInt()
val scaledHeight = (input.height / sampling).toInt()
val output = createBitmap(scaledWidth, scaledHeight, input.safeConfig)
//val output = pool.get(scaledWidth, scaledHeight, input.safeConfig)
output.applyCanvas {
scale(1 / sampling, 1 / sampling)
drawBitmap(input, 0f, 0f, paint)
}
var script: RenderScript? = null
var tmpInt: Allocation? = null
var tmpOut: Allocation? = null
var blur: ScriptIntrinsicBlur? = null
try {
script = RenderScript.create(context)
tmpInt = Allocation.createFromBitmap(script, output, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT)
tmpOut = Allocation.createTyped(script, tmpInt.type)
blur = ScriptIntrinsicBlur.create(script, Element.U8_4(script))
blur.setRadius(radius)
blur.setInput(tmpInt)
blur.forEach(tmpOut)
tmpOut.copyTo(output)
} finally {
script?.destroy()
tmpInt?.destroy()
tmpOut?.destroy()
blur?.destroy()
}
return output
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
return other is BlurTransformation &&
context == other.context &&
radius == other.radius &&
sampling == other.sampling
}
override fun hashCode(): Int {
var result = context.hashCode()
result = 31 * result + radius.hashCode()
result = 31 * result + sampling.hashCode()
return result
}
override fun toString(): String {
return "BlurTransformation(context=$context, radius=$radius, sampling=$sampling)"
}
private companion object {
private const val DEFAULT_RADIUS = 10f
private const val DEFAULT_SAMPLING = 1f
}
}
internal val Bitmap.safeConfig: Bitmap.Config
get() = config ?: Bitmap.Config.ARGB_8888
最后是compose中Image的高斯模糊代码:
val painter = rememberAsyncImagePainter(
model = ImageRequest.Builder(LocalContext.current)
.data("https://example.com/image.jpg")
.transformations(BlurTransformation(LocalContext.current))
.build()
)
Image(painter = painter,
contentDescription =null)
最后防止以后Coil的作者又把BlurTransformation重新加到新版本,导致编译出错,咱可以把BlurTransformation的名称改一下。