Can't figure out how to get the "what you see is what you get" effect, where i take a full screen image capture, and then display it as is on an imageview fragment. Currently using camerax in one fragment and imageview in another. I convert imageproxy to bitmap.
Attached image shows the previewView being full screen and captured image being scaled down
Code:
CameraX fragment
@SuppressLint("UnsafeExperimentalUsageError")
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(safeContext)
cameraProviderFuture.addListener(Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
preview = Preview.Builder().build()
val aspectRatio = Rational(viewFinder.width, viewFinder.height)
val viewport = ViewPort.Builder(aspectRatio, preview!!.targetRotation).build()
imageCapture = ImageCapture.Builder().build()
// Select back camera
val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
preview?.setSurfaceProvider(viewFinder.surfaceProvider)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(safeContext))
}
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
// Setup image capture listener which is triggered after photo has
// been taken
imageCapture.takePicture(ContextCompat.getMainExecutor(safeContext), object : ImageCapture.OnImageCapturedCallback() {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
@SuppressLint("UnsafeExperimentalUsageError")
override fun onCaptureSuccess(image: ImageProxy) {
val buffer: ByteBuffer = image.planes[0].buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
val bitmapImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, null)
image.close()
val rotation = image.imageInfo.rotationDegrees.toFloat()
findNavController().navigate(CameraXViewDirections.actionCameraXViewToReviewImageFragment(bitmapImage, rotation))
super.onCaptureSuccess(image)
ImageView Fragment:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = DataBindingUtil.inflate<FragmentReviewImageBinding>(
inflater, R.layout.fragment_review_image, container, false)
// Inflate the layout for this fragment
val args = reviewImageFragmentArgs.fromBundle(requireArguments())
binding.imageView.rotation = args.rotation
binding.imageView.setImageBitmap(args.bitmapImage)
ImageView XML: