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()
}
}
遗留问题,需要抽象封装一下,复用部分关键类对象。