Camera2apiを使用してカメラアプリケーションを構築するために、生の画像を保存しようとする際に小さな問題があります。ImageSaverのDngSaverに渡されたCaptureResultがnullです。camera2 api
私はキャプチャ結果を次のコードビットでメンバーに割り当てます。
@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
のヌルエラーを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));
}
};
私のイメージセーバークラス:私はDngCreatorを初期化しようとすると、次のようにスタックトレースがあるとき
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;
}
}
}
は今のところ、それは私にエラーを与えます。
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)
誰かが私はこの問題を解決する助けてくださいことはできますか?あなたが私からの情報をもっと必要としたら、今私に教えてください。ありがとう
onCaptureCompleted()とonImageAvailable()コールバックを互いに一致させることは可能ですか?特定のCaptureResultにどのイメージが関連しているかを知るには?正確には、私はカスタムAEを書いており、適切なISOとシャッタースピードの値を計算するために、イメージとその統計値を繰り返すプレビュー要求と照合する必要があります。 –
はい。 ImageReaderから取得したImageオブジェクトのタイムスタンプと、CaptureResult(SENSOR_TIMESTAMPフィールド)のタイムスタンプは同じキャプチャで同じです。 –