본문 바로가기

프로그래밍/Android

[Android] androidX Camera

프리뷰

fun initAndroidXCamera() {
    .
    .
    val previewConfig = PreviewConfig.Builder().apply{
        setLensFacing(CameraX.LensFacing.FRONT)
        setTargetAspectRatio(Rational(1,1))
        setTargetResolution(Size(480,640))
    }.build()
    
    val preview = Preview( previewConfig )
    preview.setOnPreviewOutputUpdateListener {
        Log.d(TAG, "onPreviewOutputUpdate")
        
        val parent = binding.viewFinder.parent as ViewGroup
        parent.removeView(binding.viewFinder)
        parent.addView(binding.viewFinder, 0)
        binding.viewFinder.surfaceTexture = it.surfaceTexture
        updateTransform()
    }
    .
    .
}

private fun updateTransform() {
    val matrix = Matrix()

	val centerX = binding.viewFinder.width / 2f
    val centerY = binding.viewFinder.height / 2f
    
    val rotationDegrees = when( binding.viewFinder.display.rotation ) {
    	Surface.ROTATION_0 -> 0
        Surface.ROTATION_90 -> 90
        Surface.ROTATION_180 -> 180
        Surface.ROTATION_270 -> 270
        else -> return
    }
        
    matrix.postRotate( -rotationDegrees.toFloat(), centerX, centerY)
    binding.viewFinder.setTransform(matrix)
}

 

 

스냅샷

fun initAndroidXCamera(){
    .
    .
    val imageCaptureConfig = ImageCaptureConfig.Builder().apply {
      setLensFacing(CameraX.LensFacing.FRONT)
      setTargetAspectRatio(Rational(1,1))
      setTargetResolution(Size(480,640))
      setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
    }.build()
    
    val imageCapture = ImageCapture( imageCaptureConfig )
    imageCapture.takePicture ( object:ImageCapture.OnImageCapturedListener() {
    	override fun onCaptureSuccess(image: ImageProxy?, rotationDegrees: Int) {
            super.onCaptureSuccess(image, rotationDegrees)
     	}
        
        override fun onError(useCaseError: ImageCapture.UseCaseError?, message: String?, cause: Throwable?) {
            super.onError(useCaseError, message, cause)
        }
    })
    .
    .
}

 

Analyzer

fun initAndroidXCamera() {
    .
    .
	// analyzer
    val analyzerConfig = ImageAnalysisConfig.Builder().apply {
    	val thread = HandlerThread("ImageAnalyzer").apply {
            start()
        }
        
        setCallbackHandler(Handler( thread.looper ))
        
        setLensFacing(CameraX.LensFacing.FRONT)
        setTargetAspectRatio(Rational(1,1))
        setTargetResolution(Size(480,640))
        setImageReaderMode( ImageAnalysis.ImageReaderMode.ACQUIRE_NEXT_IMAGE )
    }.build()

    val analyzer = ImageAnalysis( analyzerConfig )
    analyzer.analyzer = ImageAnalyzer(this)
    .
    .
}


class ImageAnalyzer(activity:ExternalCaptureActivity) : ImageAnalysis.Analyzer {
    private val activity:ExternalCaptureActivity = activity

	override fun analyze(imageProxy: ImageProxy?, rotationDegrees: Int) {
    	Log.d(activity.TAG, "analyze");
        
        val image = imageProxy?.image
        
        if( image != null  ) {
            // 획득한 image에 대한 처리를 추가
        }
    }

}