我在我的应用程序中使用android camera2拍摄连续图像,这时我使用camera2获得的图像预览亮度与原始相机相比非常暗.我看到了这个,但答案中没有类似的要求.
我试图设置camera2亮度的建议在这里:
请注意,此控件仅在android.control.aeMode!= OFF时有效.即使android.control.aeLock == true,此控件也会生效.
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);
Run Code Online (Sandbox Code Playgroud)
但它仍然显示预览为暗图像,如下所示.
看到这里的区别:
我需要传递的值是什么,作为第二个参数:
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);
Run Code Online (Sandbox Code Playgroud)
我保持6,因为正如doc的建议:
例如,如果曝光值(EV)步长为0.333,则"6"表示+2 EV的曝光补偿; -3意味着-1 EV的曝光补偿.
但亮度仍然没有影响..
我正在构建一个类似于社交媒体的应用程序,人们可以在这里分享Instagram等照片和视频.这就是为什么Camera对我的应用非常重要.现在camera2 API让我很困惑.我想在API级别11+上运行我的应用程序.我知道camera2仅适用于API级别21+因此,我需要为旧版本设计两个API(摄像头),为更高版本设计第二个(摄像头2).问题是我刚刚开始学习Android,我不知道这两个API之间的主要区别是什么.
Camera2 API有哪些主要功能?
或Old Camera API有任何缺点吗?
我的应用程序中需要三件事.
1-简单拍摄照片2-连拍图像(创建GIF图像)3-简单视频拍摄.
哪种Camera API对我有好处?
我尝试将图像从YUV_420_888转换为rgb,我对输出图像有些麻烦.在ImageReader中,我以YUV_420_888格式获取图像(使用相机2 api获取此图像预览).
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);
Run Code Online (Sandbox Code Playgroud)
在android sdk中为YuvImage类编写,即YuvImage仅使用NV21,YUY2.
因为我们可以看到N21和yuv420之间的差异不大,我尝试将数据转换为N21
在onImageAvailable中我单独获得每个Planes并将它们放在正确的位置(如图像所示)
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteBuffer bufferY = image.getPlanes()[0].getBuffer();
byte[] data0 = new byte[bufferY.remaining()];
bufferY.get(data0);
ByteBuffer bufferU = image.getPlanes()[1].getBuffer();
byte[] data1 = new byte[bufferU.remaining()];
bufferU.get(data1);
ByteBuffer bufferV = image.getPlanes()[2].getBuffer();
byte[] data2 = new byte[bufferV.remaining()];
bufferV.get(data2);
...
outputStream.write(data0);
for (int i=0;i<bufferV.remaining();i++) {
outputStream.write(data1[i]);
outputStream.write(data2[i]);
}
Run Code Online (Sandbox Code Playgroud)
创建YuvImage后,转换为Bitmap,查看并保存
final YuvImage yuvImage = new YuvImage(outputStream.toByteArray(), ImageFormat.NV21, 1920,1080, null);
ByteArrayOutputStream outBitmap = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0,1920, 1080), 95, outBitmap);
byte[] …Run Code Online (Sandbox Code Playgroud)