Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光
Posted
技术标签:
【中文标题】Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光【英文标题】:Android camera2 exposure issue. Preview is overexposed in case of YUV ImageReader use 【发布时间】:2016-08-19 23:19:00 【问题描述】:基于 Nexus 5x 的非常奇怪的问题。
我有一组普通的相机应用表面: - SurfaceHolder 用于屏幕预览 - YUV 格式的 ImageReader 用于预览帧数据 - YUV 或 JPEG 格式的 ImageReader(取决于所选的内部应用程序模式)用于捕获静止图像。
当 JPEG ImageReader 用于配置 captureSession 时,一切正常,屏幕预览正常显示。 但是当使用 YUV ImageReader 时,屏幕预览可能会因构图而过度曝光。 我必须注意,曝光测光区域设置为传感器的整个 activeRect。
查看此屏幕截图:
正常曝光预览。使用 JPEG ImageReader。
曝光过度的预览。使用 YUV ImageReader。
3&4。 JPEG 和 YUV 图像读取器。其他一些构图,现在通常会在这两种情况下公开预览。
【问题讨论】:
【参考方案1】:我终于找到了那个错误的原因!
您会感到惊讶,但该错误是由捕获会话的表面列表强制执行的。更具体地说,表面的添加顺序到列表中! 如果先添加相机预览表面(SurfaceHolder),则一切正常:
// prepare list of surfaces to be used in capture requests
List<Surface> sfl = new ArrayList<Surface>();
sfl.add(mCameraSurface); // surface for viewfinder preview
sfl.add(mPreviewImageReader.getSurface()); //preview data
sfl.add(mImageReader.getSurface()); // surface for image capture
// configure camera with all the surfaces to be ever used
camDevice.createCaptureSession(sfl, new sessionListener(), null);
但是当它最后添加时,我们得到了那个错误 - 过度曝光的预览!
// prepare list of surfaces to be used in capture requests
List<Surface> sfl = new ArrayList<Surface>();
sfl.add(mPreviewImageReader.getSurface()); //preview data
sfl.add(mImageReader.getSurface()); // surface for image capture
sfl.add(mCameraSurface); // surface for viewfinder preview
// configure camera with all the surfaces to be ever used
camDevice.createCaptureSession(sfl, new sessionListener(), null);
这让我大吃一惊!
【讨论】:
以上是关于Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光的主要内容,如果未能解决你的问题,请参考以下文章