1

写真を処理するために .dng 形式で写真を撮るアプリを作成しています。camera2 API を使用しています。写真を撮って携帯電話に保存することはできましたが、.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 として保存していたときに、以前にはなかった 1 つの警告と 1 つのエラーが発生しています。

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.JPEGImageFormat.RAW_SENSOR
  • ファイル拡張子を .jpg から .dng に変更しました
  • を使用する代わりにdngCreator.writeImage(output, image)、次を使用しました。
val buffer = image!!.planes[0].buffer
val bytes = ByteArray(buffer.capacity())
buffer.get(bytes)
output.write()

このテーマに関する情報はあまりないため、私の実装が正しいかどうかはわかりません。

4

2 に答える 2