Android Camera API 2 создает поврежденные изображения при захвате - PullRequest
0 голосов
/ 20 мая 2019

Я попытался сделать снимок с помощью 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 сохраняет изображение в галерее.

...