Android 카메라 영상이나 사진이 어두울 때 밝게 하는 방법
카메라로부터의 영상과 사진을 밝게 하는 방법으로는 노출(exposure) 값을 조정하는 방법을 통해서 원하는 기능을 구현할수 있다.
Camera.Parameters 클래스에는 카메라에 다양한 옵션들을 설정할수 있는 기능과 해당 값들이 마련되어 있다.
카메라의 zoom 조절, color에 대한 effect 설정, 초점 관련 설정, white balancing 설정, 그리고 노출정도에 대한 설정 등이다.
이 중에서 영상(사진)의 밝기를 결정하는 첫번째가 노출 값을 조정하는 것이고 또 다른 하나는 영상 밝기에 직접적인 영향을 주는 것은 아니나
white balance를 통해서 일정부분 결과를 만들어낼수 있다.
밝기 문제를 해결하는 핵심은 노출(exposure)의 값을 변경하는 것이다.
Camera.Parameters 클래스의 아래 메소드를 통해서 간단히 해결할수 있다.
public void setExposureCompensation (int value)
여기서 매개인자 value에 들어갈 값의 범위는 디바이스들 마다 각기 상이하다. 따라서 이 값을 결정하는 메소드가 2가지 제공이 된다.
getMinExposureCompensation()의 값에서 getMaxExposureCompensation()까지의 값이 value에 들어갈 값이다.
보틍은 -n ~ +n까지가 되는데 0이면 노출을 적용하지 않는 것이고 음수이면 기본 밝기보다 더 어두워지고 양수 값이면 기본 밝기 보다 더 밝아진다.
여기서 주의 할 것은 이렇게 설정된 각종 parameter 값들이 적용되는 시점은 android.hardware.Camera 클래스의 setParameters()가 실행될 때이다.
public void setParameters (Camera.Parameters params)
그런데 주의해야할 것은 이 메소드 실행 전에 각종 parameter 값들을 설정시 어떤 parameter 값들은 적용이 안되는 디바이스들이 있다. 이건 디바이스마다 상이하다.
만일 설정되어 있는 parameter 중에서 특정 디바이스에 적용이 안되는 값이 설정되어 있으면 setParameters (Camera.Parameters params) 메소드 실행시 앱이 강제 종료되는 수가 있다.
예를 들어 아래의 parameter들은 갤S4에서는 강제종료된다.
parameter.setSceneMode(Camera.Parameters.SCENE_MODE_PORTRAIT);
parameter.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
그런데 이렇게 강제 종료되지 않도록 Exception 처리를 해 두면 앱은 강제 종료가 되지 않지만 setParameters (Camera.Parameters params)가 정상 실행되지 않았기 때문에
위에서 설정했던 parameter들이 전혀 적용이 되지 않는 상황이 벌어진다. 왜 적용이 안되는가 혼란에 빠질수가 있다.
아래의 코드가 그 예이다.
try {
parameters.setPreviewFrameRate(10);
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_PORTRAIT);
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
//위의 두 parameter때문에 여기서 exception 발생하고 이 메소드 실행 안됨
//따라서 앞에서 설정했던 모든 parameter들이 하나도 적용이 안된다.
mCamera.setParameters(parameters);
} catch (Exception ex) {
Toast.makeText(mContext, "setParameters failed~", 1).show();
}
이 문제에 대한 해법은 아래와 같이 처리해 줘야 된다.
//public List<String> getSupportedSceneModes ()
List<String> sceneModeList = parameters.getSupportedSceneModes();
//public List<String> getSupportedFocusModes ()
List<String> focusModeList = parameters.getSupportedFocusModes();
try {
parameters.setPreviewFrameRate(10);
if (sceneModeList != null &&
sceneModeList.contains(Camera.Parameters.SCENE_MODE_PORTRAIT)) {
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_PORTRAIT);
}
if (focusModeList != null &&
focusModeList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
mCamera.setParameters(parameters);
} catch (Exception ex) {
Toast.makeText(mContext, "setParameters failed~", 1).show();
}
아래는 코드 조각이다.
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if (mCamera == null) return;
Camera.Parameters parameters = mCamera.getParameters();
//WHITE_BALANCE_FLUORESCENT
//WHITE_BALANCE_DAYLIGHT
//WHITE_BALANCE_CLOUDY_DAYLIGHT
//WHITE_BALANCE_INCANDESCENT
//WHITE_BALANCE_SHADE : 약간 어둡다.
//WHITE_BALANCE_WARM_FLUORESCENT : 약간 어둡다.
parameters.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_CLOUDY_DAYLIGHT);
int maxExpo = parameters.getMaxExposureCompensation();
parameters.setExposureCompensation(maxExpo);
List<String> sceneModeList = parameters.getSupportedSceneModes();
List<String> focusModeList = parameters.getSupportedFocusModes();
try {
parameters.setPreviewFrameRate(10);
if (sceneModeList != null &&
sceneModeList.contains(Camera.Parameters.SCENE_MODE_PORTRAIT)) {
parameters.setSceneMode(Camera.Parameters.SCENE_MODE_PORTRAIT);
}
if (focusModeList != null &&
focusModeList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
mCamera.setParameters(parameters);
} catch (Exception ex) {
Toast.makeText(mContext, "setParameters failed~", 1).show();
}
mCamera.startPreview();
}
'Android' 카테고리의 다른 글
adb shell을 이용한 안드로이드 앱 apk 삭제하기 (0) | 2015.12.17 |
---|---|
안드로이드 스튜디오(Android Studio)에서 구글 샘플 소스 import 하기 (0) | 2015.12.16 |
Parcelable 개념(객체 직렬화) 정리 및 bad array lengths 에러 해법 (0) | 2015.12.08 |
구글 제공 API 데모(샘플) 소스 이클립스에서 import 하는 법 (0) | 2015.11.19 |
지역변수에 final이 붙을 때의 의미에 대해(Cannot refer to a non-final variable 문제) (0) | 2015.11.16 |