0

我从 ImageReader 表面写了我的图像并得到了一张非常糟糕的照片,是比例吗?它们都是相同的(w & h),是 TotalCaptureResult 吗?,请检查下面的照片和代码,感谢您的帮助。

1- 我的 SurfaceView 的原始照片(截图)

SurfaceView holder.surface

2- 我在 captureRequest 中定位的 ImageReader Surface 输出照片。

ImageReader 表面

3-检查我的代码,一个函数中的所有代码,我在 OnCreate 中调用它。

代码 :

@RequiresApi(Build.VERSION_CODES.R)
private fun camera() {




    val thread = HandlerThread("Hthread1").apply {
        start()
    }
    val handler = Handler(thread.looper).apply {
        post {


                //-------------------------------------------------


            val w = 1920
            val h = 1080
            val Rec = Rect(0,0,w,h)

            val imageReader = ImageReader.newInstance(w,h,ImageFormat.YUV_420_888,4)

                val cm = getSystemService(Context.CAMERA_SERVICE) as CameraManager

                val surfaceview = findViewById<SurfaceView>(R.id.surfaceView).apply {



                }



                surfaceview.holder.addCallback(object : SurfaceHolder.Callback {
                    override fun surfaceCreated(p0: SurfaceHolder) {



                        val surface = surfaceview.holder.surface
                           val surface2 = imageReader.surface
                        if (ActivityCompat.checkSelfPermission(
                                applicationContext,
                                Manifest.permission.CAMERA
                            ) != PackageManager.PERMISSION_GRANTED
                        ) {
                            requestPermissions(arrayOf(Manifest.permission.CAMERA), 777777)

                            return
                        }



                        cm.getCameraCharacteristics(cm.cameraIdList.last()).get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)

                        cm.openCamera(
                            cm.cameraIdList.last(),
                            mainExecutor,
                            object : CameraDevice.StateCallback() {
                                override fun onOpened(p0: CameraDevice) {


                                    val cr =
                                        p0.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
                                            .apply {


                                                set(CaptureRequest.COLOR_CORRECTION_MODE,CaptureRequest.COLOR_CORRECTION_MODE_HIGH_QUALITY)
                                                addTarget(surface2)
                                                addTarget(surface)

                                            }.build()




                                    p0.createCaptureSession(
                                        SessionConfiguration(SessionConfiguration.SESSION_REGULAR,
                                            mutableListOf(
                                                OutputConfiguration(surface),OutputConfiguration(surface2)
                                              ),
                                            mainExecutor,
                                            object : CameraCaptureSession.StateCallback() {
                                                override fun onConfigured(p0: CameraCaptureSession) {

                                                    p0.setRepeatingRequest(
                                                        cr,
                                                        object :
                                                            CameraCaptureSession.CaptureCallback() {

                                                        },
                                                        null
                                                    )







                                                }

                                                override fun onConfigureFailed(p0: CameraCaptureSession) {

                                                }

                                            })
                                    )




                                }

                                override fun onDisconnected(p0: CameraDevice) {


                                }

                                override fun onError(p0: CameraDevice, p1: Int) {


                                }

                            })





                    }

                    override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) {


                    }

                    override fun surfaceDestroyed(p0: SurfaceHolder) {


                    }

                })


                //-------------------------------------------------














    imageReader.setOnImageAvailableListener({
        val image = it.acquireLatestImage()

        if (image!=null) {

            val buffer = image.planes.last().buffer


            val byteArray = ByteArray(buffer.remaining())

            buffer.get(byteArray)
            val YuvImage = YuvImage(byteArray, ImageFormat.YUY2, w, h, null)


            findViewById<Button>(R.id.button).setOnClickListener {
                val file = FileOutputStream(File.createTempFile("image", ".jpg", filesDir))
                YuvImage.compressToJpeg(Rec,85,file)

            }
            imageReader.discardFreeBuffers()
            image.close()
        }
    },null)


        }

    }

编辑:一张来自 ImageReader 的照片,另一张是 SurfaceView 预览的屏幕截图。

4

0 回答 0