我从 ImageReader 表面写了我的图像并得到了一张非常糟糕的照片,是比例吗?它们都是相同的(w & h),是 TotalCaptureResult 吗?,请检查下面的照片和代码,感谢您的帮助。
1- 我的 SurfaceView 的原始照片(截图)
2- 我在 captureRequest 中定位的 ImageReader Surface 输出照片。
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 预览的屏幕截图。