Я попытался сделать снимок с помощью API Camera2. Иногда выдает несколько поврежденных / неполных изображений.
Какой поток я пытаюсь реализовать?
Щелкните изображение -> используйте ImageReader для прослушивания регистрации камеры -> передайте эти байты функции, которая сохраняет изображение в галерее.
Это приводит к неполному / поврежденному изображению. (Не всегда, но не менее 3 из 5 раз.)
Я почти попробовал все, что мог найти в сети. Я думаю, что здесь есть проблема с потоком кода.
Этот код ниже запускает процесс захвата.
mState = "CLICK";
cameraCaptureSessions? .capture (captureRequestBuilder? .build (), captureCallback, mBackgroundHandler)
Capture Builder для настройки Surface в качестве устройства чтения изображений и создания следующего сеанса захвата:
var capture_builder =
cameraDevice!!.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
capture_builder.addTarget(reader.surface)
var rotation = getWindowManager().getDefaultDisplay().getRotation();
capture_builder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
capture_builder.set(CaptureRequest.JPEG_QUALITY, 70);
capture_builder.set(CaptureRequest.NOISE_REDUCTION_MODE,CameraCharacteristics.NOISE_REDUCTION_MODE_HIGH_QUALITY)
capture_builder.set(CaptureRequest.CONTROL_AF_MODE,CameraCharacteristics.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
val captureCallback_in = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureProgressed(session: CameraCaptureSession,
request: CaptureRequest,
partialResult: CaptureResult)
{}
override fun onCaptureCompleted(session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult) {
cameraCaptureSessions = session
cameraCaptureSessions?.capture(captureRequestBuilder?.build(),captureCallback,mBackgroundHandler) mState = "PREVIEW";
cameraCaptureSessions?.setRepeatingRequest(captureRequestBuilder?.build(),
captureCallback, mBackgroundHandler);
}
}
cameraCaptureSessions!!.stopRepeating()
cameraCaptureSessions!!.capture(capture_builder.build(),
captureCallback_in,mBackgroundHandler);
Это изображение слушателя, чтобы получить байты из изображения:
private var readerListener = ImageReader.OnImageAvailableListener {
var image: Image? = null;
try {
image = it.acquireLatestImage()
var buffer = image.getPlanes()[0].getBuffer();
buffer.rewind()
var bytes = ByteArray(buffer.remaining())
buffer.get(bytes);
onPictureTaken(bytes);
} catch (e: FileNotFoundException) {
e.printStackTrace();
} catch (e: IOException) {
e.printStackTrace();
} finally {
if (image != null) {
image.close();
}
}
}
OnPictureTaken сохраняет изображение в галерее.