2013-10-24 4 views
4

내 앱에서는 사용자 정의 작업으로 사진을 찍어야합니다. 모든 기능을 구현하고 사진을 저장할 수 있지만 일부 장치에서는 너무 어둡습니다. 이 코드가 있지만 도움이되지 않습니다.안드로이드 : 사용자 정의 카메라로 찍은 이미지가 너무 어둡습니다.

  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에서 볼 수있는 모든 매개 변수는 AUTO로 설정할 수 있습니다.

삼성 갤럭시 II에서 확인해 보니 완벽하게 작동하지만 일부 LG 휴대 전화에서는 너무 어둡기 때문에 이미지를 표시 할 수 없습니다. standart 카메라 앱과 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

관련 문제