安卓手机前置摄像头拍摄的照片太暗了。

9

我正在使用自定义相机应用程序拍摄前置摄像头的照片,而不是使用系统相机应用程序。但是所拍摄的照片非常暗,以至于无法正确查看照片。

我的代码:

mCamera = Camera.open(1);
Camera.Parameters params =mCamera.getParameters();
params.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);
mCamera.setParameters(params);

同时拍照

if (mCamera != null) {
try {
 mCamera.setPreviewDisplay(mSurfaceHolder);
 mCamera.startPreview();
 mCamera.takePicture(null, mPictureCallback,
 mPictureCallback);
} catch (IOException e) {
 e.printStackTrace();
    }
}

提前感谢您。请给我建议。任何帮助都将不胜感激。


1
这是否与您使用的 SCENE_MODE_NIGHT 有关?作为一名摄影师,我期望夜间模式会使照片变暗,基本上是告诉相机的曝光测量整个场景可能比普通照片要暗得多。如果您尝试使用 SCENE_MODE_AUTO 会发生什么呢? - Matt Gibson
SCENE_MODE_AUTO 拍摄暗照片。 - kiran boghra
1
你所在的地方是不是很暗?说真的,我不确定发生了什么。之前也有一个类似的问题(https://dev59.com/YXjZa4cB1Zd3GeqPdFsA)。考虑到Android硬件的差异性,给这种类型的问题提供一个确切的答案令人惊讶地困难。 - Matt Gibson
不要太暗,否则脸部看不清。有足够的灯光。 - kiran boghra
2
如果您已经解决了自己的问题,您可以在此处发布您的解决方案,以帮助其他人。 - Matt Gibson
显示剩余2条评论
3个回答

15

为解决这个问题,您可以在一段时间后拍照。请尝试以下步骤:

new Handler().postDelayed(new Runnable() {
  @Override
  public void run() {
      camera.takePicture(null, null, cameraCallback);
  }
}, 1000);

这对我也起作用了。即使我使用原始相机应用程序,它也需要一点时间才能正确曝光。 - Sam
非常感谢,终于在浪费了3个小时后也为我工作了。 - priyanka

5

我已经找到了以下解决方案,对我有用:

在使用之前,等待一些时间,即500毫秒,然后捕获图像

mCamera.takePicture(null, mPictureCallback,mPictureCallback);

对我没用。图像仍然很暗。 - Sam
我认为白平衡是关于白色的颜色而不是曝光。 - Sam

0

这个帖子中所有的答案都提到了一个任意的延迟,而问题的根本原因并没有得到解决。

安卓手机中的相机在预览开始之后、拍照之前进行自动对焦活动。问题中的代码片段在mCamera.startPreview();之后立即调用mCamera.takePicture(null, mPictureCallback,mPictureCallback);

在自动对焦过程中拍摄照片会导致曝光问题,从而导致照片变暗。答案中提到的延迟给予安卓足够的时间来完成自动对焦,从而拍摄出完美的照片。但这可能不适用于每个设备,任意的数字可能会导致某些设备失败。

我的建议是使用以下代码片段 -

Camera.AutoFocusCallback autoFocusCallBack = new Camera.AutoFocusCallback();
static autoFocusCallBack(){
    mCamera.takePicture(null, mPictureCallback,
     mPictureCallback);
}
if (mCamera != null) {
   try {
     mCamera.setPreviewDisplay(mSurfaceHolder);
     mCamera.startPreview();
     mCamera.autoFocus(autoFocusCallBack);
    } catch (IOException e) {
       e.printStackTrace();
    }
 }

这个流程确保在自动对焦回调中调用takePicture(),意味着自动对焦成功。这将提供适当曝光和亮度的正确图像。

这也将消除任意延迟。

阅读this链接了解Camera.AutoFocus()

阅读this链接了解Camera.takePicture()

阅读this链接了解Camera.startPreview()


我尝试了这种方法,但对我没有用。我创建了AutoFocusCallback并将takePicture()的代码移入其中,验证一切都被正确调用。照片出来又暗又模糊,而使用Alessandro Roaro提交的方法确实有效(使用处理程序延迟takePicture()调用)。我真的希望这个方法能够成功,以避免使用硬延迟 :-( - Joshua W
你能贴一下代码片段吗?这对我来说运行得非常顺畅。 - Paritosh
你的意思是:Camera.AutoFocusCallback autoFocusCallBack = new Camera.AutoFocusCallback(){ @Override public void onAutoFocus(boolean success, Camera camera) { mCamera.takePicture(null, mPictureCallback, mPictureCallback); } }; - kfir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接