是否可以使用相机 2 API 捕获没有纹理视图的图像?

Posted

技术标签:

【中文标题】是否可以使用相机 2 API 捕获没有纹理视图的图像?【英文标题】:Is it possible to capture the images without texture view using the camera 2 API? 【发布时间】:2019-07-08 02:50:00 【问题描述】:

在我的情况下,我不需要向用户显示预览并且想从服务中捕获图像,为此我使用 ImageFormat .JPG 来捕获图像,但输出图像真的很暗。我在 *** 中尝试过这个link,但它不起作用。

val streamConfigurationMap =
                        mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP) // Available stream configuration.
mPreviewSize = streamConfigurationMap!!.getOutputSizes(ImageFormat.JPEG)[0]
                    mCameraID = cameraId
                    mImageReader =
                            ImageReader.newInstance(mPreviewSize!!.width, mPreviewSize!!.height, ImageFormat.JPEG, 1)
                    mImageReader!!.setOnImageAvailableListener(onImageAvailable, mBackgroundHandler)

如果我使用虚拟表面纹理视图低于错误,在应用启动几秒钟后

E/BufferQueueProducer: [SurfaceTexture-1-20857-1] cancelBuffer: BufferQueue 已被放弃

【问题讨论】:

你有什么理由用 Java 标签标记 Kotlin 问题? 谢谢,我忘了添加 Kotlin,现在更新了。有些开发者可能已经使用 java 来解决这个问题,所以我也添加了 java。 【参考方案1】:

首先,您不必使用 TextureView。您的预览真的很暗的原因可能是因为您的 CaptureRequest.builder。例如,您想控制自动曝光,我稍后会在下面解释。

首先,当你设置你的表面时,你应该这样设置它:

builder.addTarget(mImageReader.getSurface());

现在谈谈亮度问题,你可以这样控制你的 AE:

builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());

getRange() 在哪里:

private Range<Integer> getRange() 
        CameraCharacteristics chars = null;
        try 
            CameraManager manager = (CameraManager) ((Activity)getContext()).getSystemService(Context.CAMERA_SERVICE);
            chars = manager.getCameraCharacteristics(mCameraId);
            Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
            Range<Integer> result = null;
            for (Range<Integer> range : ranges) 
                int upper = range.getUpper();
                // 10 - min range upper for my needs
                if (upper >= 10) 
                    if (result == null || upper < result.getUpper().intValue()) 
                        result = range;
                    
                
            
            if (result == null) 
                result = ranges[0];
            
            return result;
         catch (CameraAccessException e) 
            e.printStackTrace();
            return null;
        
    
        mImageReader = ImageReader.newInstance(hardcoded_width, hardcoded_height, ImageFormat.YUV_420_888, 2);
        mImageReader.setOnImageAvailableListener(mVideoCapture, mBackgroundHandler);

如果您想了解更多关于自定义亮度等的信息,Check this out

【讨论】:

以上是关于是否可以使用相机 2 API 捕获没有纹理视图的图像?的主要内容,如果未能解决你的问题,请参考以下文章

Android自动裁剪相机捕获的图像

android - 使用没有surfaceview或textureview的相机

相机视图的android捕获部分

将图像视图定位为相机预览上的叠加图像

是否可以裁剪相机预览?

使用相机拍摄,在图像视图中显示并保存到图片中