Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

发布于:2025-02-14 ⋅ 阅读:(111) ⋅ 点赞:(0)

Android RenderEffect对Bitmap高斯模糊(毛玻璃),Kotlin(1)

 

 

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.HardwareRenderer
import android.graphics.PixelFormat
import android.graphics.RenderEffect
import android.graphics.RenderNode
import android.graphics.Shader
import android.hardware.HardwareBuffer
import android.media.ImageReader
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.image_layout)

        //val imageView1 = findViewById<ImageView>(R.id.image1)
        val imageView2 = findViewById<ImageView>(R.id.image2)


        val srcBitmap = BitmapFactory.decodeResource(resources, R.mipmap.img)
        val radius = 10f

        val t = System.currentTimeMillis()

        val imageReader = ImageReader.newInstance(
            srcBitmap.width,
            srcBitmap.height,
            PixelFormat.RGBA_8888,
            1,
            HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE or HardwareBuffer.USAGE_GPU_COLOR_OUTPUT
        )
        val renderNode = RenderNode("BlurEffect")
        val hardwareRenderer = HardwareRenderer()

        hardwareRenderer.setSurface(imageReader.surface)
        hardwareRenderer.setContentRoot(renderNode)
        renderNode.setPosition(0, 0, imageReader.width, imageReader.height)
        val blurRenderEffect = RenderEffect.createBlurEffect(
            radius, radius,
            Shader.TileMode.MIRROR
        )
        renderNode.setRenderEffect(blurRenderEffect)

        val renderCanvas = renderNode.beginRecording()
        renderCanvas.drawBitmap(srcBitmap, 0f, 0f, null)
        renderNode.endRecording()
        hardwareRenderer.createRenderRequest()
            .setWaitForPresent(true)
            .syncAndDraw()

        val image = imageReader.acquireNextImage() ?: throw RuntimeException("No Image")
        val hardwareBuffer = image.hardwareBuffer ?: throw RuntimeException("No HardwareBuffer")
        val bmp = Bitmap.wrapHardwareBuffer(hardwareBuffer, null)
            ?: throw RuntimeException("Create Bitmap Failed")

        Log.d("fly", "cost time=${System.currentTimeMillis() - t}")

        imageView2.setImageBitmap(bmp)


        //清理工作
        hardwareBuffer.close()
        image.close()
        imageReader.close()
        renderNode.discardDisplayList()
        hardwareRenderer.destroy()
    }
}

 

 

 

遗留问题,需要抽象封装一下,复用部分关键类对象。

 

 

Android新版高斯模糊(毛玻璃)官方实现,Kotlin-CSDN博客文章浏览阅读577次,点赞13次,收藏4次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)_android kotlin实现毛玻璃遮罩-CSDN博客。 https://blog.csdn.net/zhangphil/article/details/145575404

 


网站公告

今日签到

点亮在社区的每一天
去签到