2013-10-24 96 views
4

在我的应用程序中,我必须拍摄带有自定义活动的照片。我实现了所有功能并可以保存我的照片,但在某些设备中,它们太暗了。我有这样的代码,但它并不能帮助我Android:自定义相机拍摄的图像太暗

  Parameters params = mCamera.getParameters(); 
      if (params.getSupportedWhiteBalance().contains(
        Parameters.WHITE_BALANCE_AUTO)) { 
       params.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO); 
       Log.d(TAG, "white balance auto"); 
      } 
      if (params.getSupportedFlashModes().contains(
        Parameters.FLASH_MODE_AUTO)) { 
       params.setFlashMode(Parameters.FLASH_MODE_AUTO); 
       Log.d(TAG, "flash mode auto"); 
      } 
      if (params.getSupportedSceneModes().contains(
        Parameters.SCENE_MODE_AUTO)) { 
       params.setSceneMode(Parameters.SCENE_MODE_AUTO); 
       Log.d(TAG, "scene mode auto"); 
      } 
      mCamera.setParameters(params); 

在logcat中我看到,所有PARAMS可以设置好的为AUTO。

我在Samsung Galaxy II中检查过它,它的工作原理非常完美,但在某些LG手机中,我甚至无法拍摄图像,因为它太暗了。由标准相机应用和Facebook相机应用拍摄的照片看起来非常完美,因此可以完成。

对不起,我的英语=)

+0

有关更改曝光补偿什么?你可以使用'setExposureCompensation(int)'手动设置。 –

+0

感谢您的回复。我的应用应该能够在不同类型的闪电中拍摄出好的照片,所以我只想使用自动设置。 – rstk

回答

2

我发现了一个很奇怪的解决这一问题。当我的相机预览和拍摄的照片具有相同的比例时,在所有测试过的设备上生成的照片看起来不错因此,在获得最佳预览尺寸后,我正在以相同的比例搜索支持的图片尺寸。

这很奇怪,但它的工作原理。

所以,首先我们需要预览大小。

protected Size getOptimalPreviewSize(List<Size> sizes, int width, int height) { 
    Log.d(TAG, String 
      .format("getOptimalPreviewSize: width = %d, height = %d", 
        width, height)); 
    final double ASPECT_TOLERANCE = 0.01; 
    final double targetRatio = (double) 4/3d; 
    if (sizes == null) 
     return null; 

    Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 

    int targetHeight = height; 

    // Try to find an size match aspect ratio and size 
    double ratio; 
    Size size; 
    for (int i = 0; i < sizes.size(); i++) { 
     size = sizes.get(i); 
     ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) 
      continue; 
     if (Math.abs(size.height - targetHeight) < minDiff) { 
      optimalSize = size; 
      minDiff = Math.abs(size.height - targetHeight); 
     } 
    } 

    // Cannot find the one match the aspect ratio, ignore the requirement 
    if (optimalSize == null) { 
     minDiff = Double.MAX_VALUE; 
     for (int i = 0; i < sizes.size(); i++) { 
      size = sizes.get(i); 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 
    } 

    if (optimalSize == null) { 
     Log.d(TAG, "Optimal size not found"); 
    } else { 
     Log.d(TAG, 
       String.format(
         "getOptimalPreviewSize result: width = %d, height = %d for input width = %d, height = %d", 
         optimalSize.width, optimalSize.height, width, 
         height)); 
    } 

    return optimalSize; 
} 

然后我们需要得到图片大小,这将与预览大小相同。

private Size getOptimalPictureSize() { 
    if (mCamera == null) 
     return null; 

    List<Size> cameraSizes = mCamera.getParameters() 
      .getSupportedPictureSizes(); 
    Size optimalSize = mCamera.new Size(0, 0); 
    double previewRatio = (double) mPreviewSize.width/mPreviewSize.height; 

    for (Size size : cameraSizes) { 
     double ratio = (double) size.width/size.height; 
     if (Math.abs(ratio - previewRatio) > 0.01f) 
      continue; 
     if (size.height > optimalSize.height) { 
      optimalSize = size; 
     } 
    } 

    if (optimalSize.height == 0) { 
     for (Size size : cameraSizes) { 
      if (size.height > optimalSize.height) { 
       optimalSize = size; 
      } 
     } 
    } 
    return optimalSize; 
} 

然后将此大小来Camera.Parametres

 Size optimalSize = getOptimalPictureSize(); 

    Parameters params = mCamera.getParameters(); 
    Log.d(TAG, "picture size " + optimalSize.width + " " 
      + optimalSize.height); 
    params.setPictureSize(optimalSize.width, optimalSize.height); 
    mCamera.setParameters(params); 
+0

我的相机预览和拍摄的图片具有相同的比例,因此所有测试设备上的图片效果都很好。这是什么???你可以请给出一个示例代码逻辑,因为我有自定义相机应用程序的相同问题。 –

+0

@kiranboghra,我用代码编辑我的答案 – rstk

+0

对我来说,没有对亮度/曝光有任何影响。图像仍然黑暗。 – Sam

相关问题