android camerax怎樣實(shí)現(xiàn)實(shí)時(shí)濾鏡

小樊
81
2024-11-16 20:26:01

在Android中使用CameraX庫(kù)實(shí)現(xiàn)實(shí)時(shí)濾鏡,可以通過(guò)以下步驟來(lái)完成:

  1. 添加依賴: 首先,在你的build.gradle文件中添加CameraX和濾鏡相關(guān)的依賴項(xiàng)。

    dependencies {
        implementation 'androidx.camera:camera-core:1.0.0'
        implementation 'androidx.camera:camera-camera2:1.0.0'
        implementation 'androidx.camera:camera-lifecycle:1.0.0'
        implementation 'androidx.camera:camera-view:1.0.0'
        implementation 'com.google.android.material:material:1.2.1'
        // 如果你需要使用濾鏡庫(kù),可以添加如Glide或Picasso等庫(kù)
    }
    
  2. 配置CameraX: 在你的Activity或Fragment中,配置CameraX并設(shè)置預(yù)覽視圖。

    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import androidx.camera.core.CameraSelector
    import androidx.camera.core.ImageAnalysis
    import androidx.camera.core.ImageProxy
    import androidx.camera.core.ImageAnalyzer
    import androidx.camera.core.ImageProxy
    import androidx.camera.lifecycle.ProcessCameraProvider
    import androidx.camera.view.PreviewView
    import kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.launch
    import java.util.concurrent.ExecutorService
    import java.util.concurrent.Executors
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var cameraProviderFuture: ProcessCameraProvider
        private lateinit var previewView: PreviewView
        private lateinit var imageAnalyzer: ImageAnalyzer
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            previewView = findViewById(R.id.previewView)
    
            // 創(chuàng)建一個(gè)單線程的ExecutorService用于圖像分析
            val executor: ExecutorService = Executors.newSingleThreadExecutor()
    
            // 獲取CameraProvider
            cameraProviderFuture = ProcessCameraProvider.getInstance(this)
    
            // 設(shè)置預(yù)覽視圖
            previewView.previewViewInfo = PreviewView.PreviewViewInfo.Builder().build()
    
            // 創(chuàng)建圖像分析器
            imageAnalyzer = ImageAnalyzer(executor)
    
            // 設(shè)置相機(jī)選擇器
            val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
    
            // 綁定預(yù)覽視圖和相機(jī)提供者
            cameraProviderFuture.addListener({
                val cameraProvider = cameraProviderFuture.get()
                bindPreviewAndImageAnalyzer(cameraProvider)
            }, ContextCompat.getMainExecutor(this))
        }
    
        private fun bindPreviewAndImageAnalyzer(cameraProvider: ProcessCameraProvider) {
            val preview = Preview.Builder().build().also {
                it.setSurfaceProvider(previewView.surfaceProvider)
            }
    
            val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
    
            val imageAnalyzer = ImageAnalyzer(executor)
    
            val cameraTap = ImageProxy.Builder().build()
    
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalyzer, cameraTap)
        }
    }
    
  3. 實(shí)現(xiàn)圖像分析器: 創(chuàng)建一個(gè)圖像分析器類,用于處理圖像并應(yīng)用濾鏡效果。

    import android.renderscript.Allocation
    import android.renderscript.Element
    import android.renderscript.RenderScript
    import android.renderscript.ScriptIntrinsicBlur
    import androidx.camera.core.ImageProxy
    import java.nio.ByteBuffer
    
    class ImageAnalyzer(private val executor: ExecutorService) : ImageAnalysis.Analyzer {
    
        private val rs = RenderScript.create(applicationContext)
        private val inAllocation = Allocation.createFromBitmap(rs, (previewView as PreviewView).image)
        private val outAllocation = Allocation.createFromBitmap(rs, (previewView as PreviewView).image)
        private val scriptIntrinsicBlur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
    
        override fun analyze(imageProxy: ImageProxy) {
            if (imageProxy.image != null) {
                val mediaImage = imageProxy.image!!
                inAllocation.copyFrom(mediaImage)
    
                // 應(yīng)用濾鏡效果
                scriptIntrinsicBlur.setRadius(5f) // 設(shè)置模糊半徑
                scriptIntrinsicBlur.setInput(inAllocation)
                scriptIntrinsicBlur.forEach(outAllocation)
    
                // 將處理后的圖像設(shè)置回預(yù)覽視圖
                outAllocation.copyTo(mediaImage)
                imageProxy.image = mediaImage
    
                // 釋放資源
                inAllocation.destroy()
                outAllocation.destroy()
            }
    
            imageProxy.close()
        }
    }
    
  4. 布局文件: 確保你的布局文件中有一個(gè)PreviewView用于顯示預(yù)覽圖像。

    <androidx.camera.view.PreviewView
        android:id="@+id/previewView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    

通過(guò)以上步驟,你可以在Android中使用CameraX庫(kù)實(shí)現(xiàn)實(shí)時(shí)濾鏡效果。注意,這里的示例使用了RenderScript來(lái)進(jìn)行模糊效果的處理,你可以根據(jù)需要替換為其他濾鏡效果。

0