Я создаю приложение, которое делает снимки в формате .dng для их обработки. Я использую API camera2. Мне удалось сделать снимки и сохранить их в телефоне, но в формате .jpg. Но когда я меняю свой код, чтобы сохранить их с расширением .dng, он компилируется, покажите мне предварительный просмотр на моем телефоне, но когда снимок сделан, я получаю сообщение об ошибке. Часть моего кода, которая берет и сохраняет изображение, выглядит следующим образом.
val reader = ImageReader.newInstance(1280, 720, ImageFormat.RAW_SENSOR, 1)
val outputSurfaces = ArrayList<Surface>(2)
outputSurfaces.add(reader.surface)
outputSurfaces.add(Surface(previewTextureView.surfaceTexture))
val captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
captureBuilder.addTarget(reader.surface)
captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO)
val file = File("myPath/myImageName.dng")
var captureResult: CaptureResult? = null
И мои слушатели:
val readerListener = object : ImageReader.OnImageAvailableListener {
override fun onImageAvailable(reader: ImageReader) {
var image: Image? = null
var output: OutputStream? = null
val dngCreator = DngCreator(cameraManager.getCameraCharacteristics("0"), captureResult)
try {
image = reader.acquireLatestImage()
output = FileOutputStream(file)
dngCreator.writeImage(output, image)
} catch (e: FileNotFoundException) {
e.printStackTrace()
} catch (e: IOException) {
e.printStackTrace()
} finally {
output?.close()
image?.close()
}
}
}
reader.setOnImageAvailableListener(readerListener, backgroundHandler)
val captureListener = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
captureResult = result
super.onCaptureCompleted(session, request, result)
}
}
И, наконец, я фиксирую сеанс с помощью:
cameraDevice.createCaptureSession(outputSurfaces, object : CameraCaptureSession.StateCallback() {
override fun onConfigured(session: CameraCaptureSession) {
try {
session.capture(captureBuilder.build(), captureListener, backgroundHandler)
} catch (e: CameraAccessException) {
e.printStackTrace()
}
}
override fun onConfigureFailed(session: CameraCaptureSession) {}
}, backgroundHandler)
У меня есть одно предупреждение и одна ошибка, которых раньше не было, когда я сохранял изображение в формате jpeg:
W/CameraDevice-JV-0: Stream configuration failed due to: createSurfaceFromGbp:1106: Camera 0: No supported stream configurations with format 0x20 defined, failed to create output stream
E/CameraCaptureSession: Session 1: Failed to create capture session; configuration failed
Вещи, которые я изменил, чтобы сохранить файл dng:
- Я заменил
ImageFormat.JPEG
наImageFormat.RAW_SENSOR
- Я изменил расширение файла с .jpg на .dng
- Вместо использования
dngCreator.writeImage(output, image)
я использовал:
val buffer = image!!.planes[0].buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
output.write()
Поскольку информации по этому вопросу не так много, я не уверен, что моя реализация верна.
dngCreator
, но ошибка не исчезла даже после этой попытки? - person Alex Cohn   schedule 21.07.2019