使用camera2 API捕获图片而不进行预览

亚历山德罗·罗阿罗

我要实现的是捕获图片而不显示预览,直接将输出发送到ImageReader我以Camera2Basic示例为起点。但是,ImageReader永远不会调用my的回调,因此不会向其发送任何图像Surface我真的需要先显示预览吗?

这是摄像机代码,按照异步回调的流程进行排序:

private ImageReader imageReader;
private Handler backgroundHandler;
private HandlerThread backgroundThread;
private String cameraId;
private CameraDevice cameraDevice;
private CameraCaptureSession cameraCaptureSession;
    @Override
    public void onCreate() {
        setupCamera2();
    }

    private void setupCamera2() {
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

        try {

            for (String cameraId : manager.getCameraIdList()) {
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);

            if (characteristics.get(CameraCharacteristics.LENS_FACING) != CameraCharacteristics.LENS_FACING_FRONT) {
                continue;
            }

            this.cameraId = cameraId;

            int[] picSize = Settings.getPictureSize();
            int picWidth = picSize[0];
            int picHeight = picSize[1];

            imageReader = ImageReader.newInstance(picWidth, picHeight, ImageFormat.JPEG, 2);
            imageReader.setOnImageAvailableListener(onImageAvailableListener, backgroundHandler);
            }

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


    private void openCamera2() {
        CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        try {

            manager.openCamera(cameraId, cameraStateCallback, backgroundHandler);

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



    private final CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice device) {
            cameraDevice = device;
            createCameraCaptureSession();
        }

        @Override
        public void onDisconnected(CameraDevice cameraDevice) {}

        @Override
        public void onError(CameraDevice cameraDevice, int error) {}
    };



    private void createCaptureSession() {
        List<Surface> outputSurfaces = new LinkedList<>();
        outputSurfaces.add(imageReader.getSurface());

        try {

            cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(CameraCaptureSession session) {
                    cameraCaptureSession = session;
                }

                @Override
                public void onConfigureFailed(CameraCaptureSession session) {}
            }, null);

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


    private final ImageReader.OnImageAvailableListener onImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            createCaptureRequest();
        }
    };


    private void createCaptureRequest() {
        try {

            CaptureRequest.Builder requestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            requestBuilder.addTarget(imageReader.getSurface());

            // Focus
            requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

            // Orientation
            int rotation = windowManager.getDefaultDisplay().getRotation();
            requestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));

            cameraCaptureSession.capture(requestBuilder.build(), camera2Callback, null);

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

您应该在“ onConfigured”功能中捕获照片,而不是onImageAvailable。

public void onConfigured(CameraCaptureSession session) {
            cameraCaptureSession = session;
            createCaptureRequest();
        }

在“ onImageAvailable”功能中,您应该保存图像,

Image image = mImageReader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
try {
    save(bytes, file);
} catch (IOException e) {
    e.printStackTrace();
}
image.close();

在session.capture()之后将调用“ onImageAvailable”函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Android Camera2 API捕获单个图像?

来自分类Dev

使用Android Camera2 API在后台捕获视频

来自分类Dev

使用Android camera2获得全屏预览

来自分类Dev

无法使用 Camera2 Api 启用 Flash

来自分类Dev

使用 Camera2 API 设置相机变焦

来自分类Dev

Camera2 API 问题

来自分类Dev

使用Android L和Camera2 API的相机预览图像数据处理

来自分类Dev

Android Camera2预览被拉伸

来自分类Dev

Android Camera2 空预览图像

来自分类Dev

我应该为Android使用Camera2还是Camera API?

来自分类Dev

使用Android Camera2 API快速捕获闪光/不闪光图像

来自分类Dev

Android Camera2捕获歪斜的图像

来自分类Dev

预览创建布局programmaticaly时streched在Camera2 API

来自分类Dev

使用camera2 API在前置摄像头中进行全屏视频录制

来自分类Dev

如何使用camera2获取2个输出捕获会话

来自分类Dev

前置Camera2 API GLSurfaceview

来自分类Dev

Android Camera2 API和EXIF

来自分类Dev

使用Android camera2使用闪光灯进行手动对焦

来自分类Dev

使用zxing解码camera2拍摄的图片中的数据矩阵

来自分类Dev

使用Android Camera2设置视频捕获中的亮度/对比度

来自分类Dev

使用Android camera2 API打开/关闭闪光灯不起作用

来自分类Dev

Android L-使用Camera2 API自动对焦拍摄闪光灯图像

来自分类Dev

使用camera2 API createCaptureSession后,Android无法仅播放视频音频

来自分类Dev

Android Camera2:如何使用SENSOR_BLACK_LEVEL_PATTERN API?

来自分类Dev

如何使用camera2 API将焦距强制为固定值?

来自分类Dev

Camera2 API中等效的Camera.PreviewCallback

来自分类Dev

Camera2可以连续访问相机预览图像

来自分类Dev

Android camera2捕获连拍太慢

来自分类Dev

Android API 21+ Camera2 API

Related 相关文章

热门标签

归档