You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Painter转换为Bitmap?实现简化的BlurImage函数

将Painter转换为Bitmap以实现模糊处理函数

要实现把Painter传入BlurImage()函数并完成模糊处理,核心是解决Painter到Bitmap的转换问题——因为RenderScriptToolkit.blur()需要Bitmap作为输入。以下是具体实现方案:

通用转换方案(适配所有Painter类型)

不管是painterResource()返回的矢量图Painter还是BitmapPainter,都可以通过绘制到Canvas的方式生成Bitmap,代码如下:

fun BlurImage(
    painter: Painter,
    context: Context
) {
    // 获取Painter的固有尺寸,若尺寸无效直接返回
    val intrinsicSize = painter.intrinsicSize
    if (intrinsicSize.width <= 0 || intrinsicSize.height <= 0) {
        return
    }

    // 根据屏幕密度计算实际Bitmap尺寸,避免模糊后图像失真
    val density = context.resources.displayMetrics.density
    val bitmapWidth = (intrinsicSize.width * density).toInt()
    val bitmapHeight = (intrinsicSize.height * density).toInt()

    // 创建空Bitmap
    val bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888)
    // 创建Canvas并将Painter内容绘制到Bitmap上
    val canvas = Canvas(bitmap)
    painter.draw(
        canvas = canvas,
        size = Size(intrinsicSize.width, intrinsicSize.height)
    )

    // 执行模糊处理
    val blurredBitmap = RenderScriptToolkit.blur(bitmap, 24)

    // 后续可对blurredBitmap进行使用,比如转为Painter显示
    // val blurredPainter = BitmapPainter(blurredBitmap.asImageBitmap())
}

// 在Composable中调用示例
@Composable
fun UsageExample() {
    val context = LocalContext.current
    BlurImage(
        painter = painterResource(id = R.drawable.sample_image),
        context = context
    )
}

针对BitmapPainter的简化方案

如果确定传入的Painter是BitmapPainter(比如从Bitmap直接创建的Painter),可以直接获取内部的Bitmap,省去绘制步骤:

fun BlurImage(
    painter: Painter
) {
    if (painter is BitmapPainter) {
        val bitmap = painter.bitmap
        val blurredBitmap = RenderScriptToolkit.blur(bitmap, 24)
        // 后续处理...
    } else {
        // 非BitmapPainter类型,回退到通用绘制方案
    }
}

注意事项

  • 矢量图(VectorDrawable)对应的VectorPainter无法直接提取Bitmap,必须通过Canvas绘制的方式转换。
  • 创建Bitmap时记得考虑屏幕密度,否则生成的图像可能会出现缩放模糊问题。

内容的提问来源于stack exchange,提问作者NubPro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:14