gpt4 book ai didi

Android Camera2 Burst 和 ImageReader

转载 作者:行者123 更新时间:2023-11-30 01:30:17 25 4
gpt4 key购买 nike

我正在尝试获取多张曝光时间不同的图片来执行我的HDR 算法。但是,我不知道如何在 Android camera2 APIImageReader 中使用 captureBurst() 来保存文件。我的代码将创建重复的文件。谁能帮帮我?

private ImageReader mImageReader;
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener =
new ImageReader.OnImageAvailableListener() {

@Override
public void onImageAvailable(ImageReader reader) {
mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage()));
}
};

private static class ImageSaver implements Runnable {
private final Image mImage;

private ImageSaver(Image image) {
mImage = image;

}

private File createNewImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "IMG_" + timeStamp;
File storageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/Camera");
File image = File.createTempFile(imageFileName, ".jpg", storageDirectory);
return image;
}

@Override
public void run() {
ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);

FileOutputStream fileOutputStream = null;

try {
File newFile = null;
try {
newFile = createNewImageFile();
} catch (IOException e) {
e.printStackTrace();
}

fileOutputStream = new FileOutputStream(newFile);
fileOutputStream.write(bytes);

mImageFileNameList.add(newFile.getName());

} catch (IOException e) {
e.printStackTrace();
} finally {
mImage.close();
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

private void captureStillImage() {
try {
CaptureRequest.Builder captureStillBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureStillBuilder.addTarget(mImageReader.getSurface());

CaptureRequest.Builder captureStillBuilder2 = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureStillBuilder2.addTarget(mImageReader.getSurface());

int rotation = getWindowManager().getDefaultDisplay().getRotation();

captureStillBuilder.set(CaptureRequest.JPEG_ORIENTATION,
ORIENTATIONS.get(rotation));
captureStillBuilder2.set(CaptureRequest.JPEG_ORIENTATION,
ORIENTATIONS.get(rotation));

CameraCaptureSession.CaptureCallback captureCallback =
new CameraCaptureSession.CaptureCallback() {

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

List<CaptureRequest> list = new ArrayList<>();

captureStillBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureStillBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
captureStillBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, ONE_SECOND / 100);

captureStillBuilder2.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureStillBuilder2.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
captureStillBuilder2.set(CaptureRequest.SENSOR_EXPOSURE_TIME, ONE_SECOND / 20);

list.add(captureStillBuilder.build());
list.add(captureStillBuilder2.build());

mCameraCaptureSession.captureBurst(list, captureCallback, null);

} catch (CameraAccessException e) {
e.printStackTrace();
}
}

最佳答案

如果一切似乎都不正常,而您的问题只是文件名重复,那可能只是因为您的手机可以以小于 1 秒的速度捕获两个 JPEG。

图像文件名的格式字符串是:“yyyyMMdd_HHmmss”这不包括任何小数秒,所以拍摄的照片,比如说12:35:15.100 和 12:35:15.700(相隔 600 毫秒)将映射到相同的文件名,IMG_..._123515.jpg.

根据 SimpleDateFormat,您可以将“_SSS”添加到您的字符串中以包含毫秒。文档,这应该可以消除文件名的歧义,除非它们被捕获真的很快。

或者,您可以为同名文件保留某种计数器,并在发生冲突时附加 _1、_2 等。

关于Android Camera2 Burst 和 ImageReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35839228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com