1

camera2api を使用してカメラ アプリを作成するという私の探求では、未加工の画像を保存しようとしているときに小さな問題が発生しました。

次のコードで、キャプチャ結果をメンバーに割り当てます。

@Override

public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
                        super.onCaptureCompleted(session, request, result);


                        mCaptureResult = result;
                        Toast.makeText(getApplicationContext(),
                                "Image Captured",Toast.LENGTH_SHORT).show();

                    }
                };

この場所でデバッグすると、メンバーが割り当てられ、null ではありません。ただし、クラスDngCreator内でnullエラーをスローすると。ImageSaver

私のリスナー:

private ImageReader mImageReader;
private ImageReader.OnImageAvailableListener mOnImageAvailableListener =
        new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {
                mBackgroundHandler.post(new ImageSaver(imageReader.acquireNextImage(),mUiHandler,
                        mCaptureResult, mCameraCharacteristics));
            }
        };

private ImageReader mRawImageReader;
private ImageReader.OnImageAvailableListener mOnRawImageAvailableListener =
        new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader imageReader) {
                mBackgroundHandler.post(new ImageSaver(imageReader.acquireNextImage(),mUiHandler,
                        mCaptureResult, mCameraCharacteristics));
            }
        };

私のイメージセーバークラス:

    private ImageSaver(Image image, Handler handler, CaptureResult captureResult,
                       CameraCharacteristics cameraCharacteristics) {
        mImage = image;
        mHandler =handler;
        mCaptureResult = captureResult;
        mCameraCharacteristics = cameraCharacteristics;
    }



    @Override
    public void run() {
        int format = mImage.getFormat();
        switch(format){
            case ImageFormat.JPEG:
                ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[byteBuffer.remaining()];
                byteBuffer.get(bytes);

                FileOutputStream fileOutputStream = null;
                try {
                    fileOutputStream = new FileOutputStream(mImageFile);
                    fileOutputStream.write(bytes);
                }
                catch (IOException e){
                    e.printStackTrace();
                }
                finally {
                    mImage.close();
                    if(fileOutputStream != null){
                        try{
                            fileOutputStream.close();
                        }
                        catch (IOException e){
                            e.printStackTrace();
                        }
                    }
                    //Message message = mHandler.obtainMessage();
                    //message.sendToTarget();
                }
                break;
            case ImageFormat.RAW_SENSOR:
                DngCreator dngCreator = new DngCreator(mCameraCharacteristics,mCaptureResult);
                FileOutputStream rawFileOutputStream = null;
                try {
                    rawFileOutputStream = new FileOutputStream(mRawImageFile);
                    dngCreator.writeImage(rawFileOutputStream, mImage);
                }
                catch (IOException e){
                    e.printStackTrace();
                }
                finally{
                    mImage.close();
                    if(rawFileOutputStream != null){
                        try {
                            rawFileOutputStream.close();
                        }
                        catch (IOException e){
                            e.printStackTrace();
                        }
                    }
                }
                break;
        }


    }
}

現在、DngCreator を初期化しようとするとエラーが発生し、スタック トレースは次のようになります。

FATAL EXCEPTION: Camera2 Background Thread Process: com.something.something, PID: 5162 java.lang.IllegalArgumentException: Null argument to DngCreator constructor at android.hardware.camera2.DngCreator.<init>(DngCreator.java:89) at com.something.something.ControlCameraActivity$ImageSaver.run(ControlCameraActivity.java:328) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.os.HandlerThread.run(HandlerThread.java:61)

誰かがこれを修正するのを手伝ってくれますか? 私からの情報がさらに必要な場合は、今すぐお任せください。ありがとう

4

2 に答える 2

2

onCaptureCompleted() が OnImageAvailable() の前に発生するという保証はありません。実際、多くの場合、RAW 画像バッファはプレビューおよび結果メタデータの画像処理が完了する前に準備が整うため、onImageAvailable() の後に onCaptureCompleted() が発生する可能性が非常に高くなります。

onImageAvailable が最初に発生した場合は、まだキャプチャ結果がありません。

代わりに、画像とキャプチャ結果の両方が完了するのを待ってから、ImageSaver を作成する必要があります。1 つのオプションとして、両方のコールバックでそれぞれの出力 (キャプチャ結果と画像) を共有の場所に保存し、両方が null でないかどうかを確認します。そうであれば、ImageSaver を呼び出します。次に、どちらが最初に実行されても問題ありません。2 番目に実行されたものが ImageSaver を起動します。

于 2016-08-31T02:04:55.473 に答える