当前位置: 首页 > 知识库问答 >
问题:

如何设置Android相机2预览和捕捉大小?

郏志学
2023-03-14

我正在使用SurfaceView来显示我捕获的预览。我想使用宽度=1080,高度=1920作为预览。在哪里可以设置预览的大小?

我用谷歌搜索了答案,但它们都是相机版本一的。我正在使用android.hardware.camera2。

private void takePreview() {
    try {
        final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
        mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(), mImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③
        {
            @Override
            public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                if (null == mCameraDevice) return;
                mCameraCaptureSession = cameraCaptureSession;
                try {
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
                    previewRequestBuilder.set(CaptureRequest.JPEG_THUMBNAIL_SIZE, new Size(1080,1920));

                    CaptureRequest previewRequest = previewRequestBuilder.build();
                    mCameraCaptureSession.setRepeatingRequest(previewRequest, null, childHandler);
                } catch (CameraAccessException e) {
                    Log.e("takePreview","onConfigured(CameraCaptureSession cameraCaptureSession)",e);
                }
            }
            @Override
            public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                Log.e("takePreview","onConfigureFailed");
            }
        }, childHandler);
    } catch (CameraAccessException e) {
        Log.e("takePreview","CameraAccessException");
    }
}

共有3个答案

乐刚毅
2023-03-14

要设置预览大小:mSurfaceTexture。设置默认缓冲区大小(宽度、高度) 函数中选择code>。

要设置捕获(图片)大小:ImageReader。newInstance(宽度、高度、格式、最大尺寸)

韩楷
2023-03-14

看看Google在GitHub上提供的Camama2Basic示例:https://github.com/googlesamples/android-Camera2Basic

在主片段中有一种方法可以为给定的设备选择最佳预览大小。如果你想让你的应用程序更灵活,而不是硬编码大小,这可能是一个更好的方法,但即使你仍然希望坚持设置大小,你也可以看到他们如何使用结果。

总结是,您只需将TextureView的大小设置为您想要的大小。

方法名称为“chooseOptimalSize”,其中包括以下注释/解释:

/**
     * Given {@code choices} of {@code Size}s supported by a camera, choose the smallest one that
     * is at least as large as the respective texture view size, and that is at most as large as the
     * respective max size, and whose aspect ratio matches with the specified value. If such size
     * doesn't exist, choose the largest one that is at most as large as the respective max size,
     * and whose aspect ratio matches with the specified value.
     *
     * @param choices           The list of sizes that the camera supports for the intended output
     *                          class
     * @param textureViewWidth  The width of the texture view relative to sensor coordinate
     * @param textureViewHeight The height of the texture view relative to sensor coordinate
     * @param maxWidth          The maximum width that can be chosen
     * @param maxHeight         The maximum height that can be chosen
     * @param aspectRatio       The aspect ratio
     * @return The optimal {@code Size}, or an arbitrary one if none were big enough
     */
魏晨
2023-03-14

如对createCapture会话的引用中所述:

对于绘制到SurfaceView:创建SurfaceView的曲面后,使用setFixedSize(int,int)将曲面的大小设置为getOutputSizes(SurfaceHolder.class)返回的大小之一,然后通过调用getSurface()获取曲面。如果应用程序未设置大小,则相机设备会将其舍入到最近支持的小于1080p的大小。

 类似资料:
  • null null 当然,任何其他建议都将不胜感激。 注意:也有类似的问题,我花了几个小时来研究,但没有一个正确地解决了我的问题,也没有给出足够的细节。

  • 我一直在努力在Android上制作我的自定义相机活动,但当旋转相机时,表面视图的纵横比会变得混乱。 在我的oncreate for the activity中,我设置了framelayout,它保存了显示相机参数的曲面视图。 然后,在曲面视图中,我设置要显示的相机参数 您可以看到,当手机旋转时,乐高男会变得更高、更瘦: 如何确保相机视图的纵横比正确?

  • 我正在开发一个灯光(LED)通信系统,使用Android手机摄像头作为接收器,对摄像头帧进行阈值处理。为此,我使用了preview的回调方法onPreviewFrame。为了更准确,需要每隔几帧延迟一帧的捕获,以便系统将重新同步。 我的问题是: 如何延迟单个帧的捕获(而不是预览) *为了限制相机的fps速率,我使用了setPreviewFpsRange、setAutoWhiteBalanceLoc

  • 我的应用程序提供了一个摄像头,允许用户拍照或录制视频。我不可能知道用户将选择哪个操作。所以我需要为两个动作提供相机预览。使用旧的camera API没有任何问题,但我不确定camera2 API。

  • 我使用相机仅显示预览(不拍照或录制视频)。 该应用程序始终处于竖屏状态(横向模式被禁用)。相机预览始终旋转90度ccw,我无法更改它(无论是还是和。 预览总是这样旋转还是依赖于设备?如果在纵向模式下总是这样,我可以在之后旋转图像。 或者有没有办法正确设置摄像头?我读了很多关于这个的帖子,但没有一个答案对我有用(Galaxy s2,Android v2.3)

  • 请帮助正确配置Android摄像头(在HTC Desire 2.3.3上测试),以便在旋转(人像)模式下从摄像头预览。预览必须占用屏幕的一半以下,它的宽度必须等于设备的宽度,缩放必须根据相机的纵横比动态设置。我的当前代码: 活动布局: AndroidManifest配置为肖像: 你可以看到图像的比例不对。如何使以适当的比例显示旋转和缩放相机预览? 部分代码取自Mixare开源项目,http://w