안드로이드 개발 정보
(글 수 568)
zxing를 landscape에서 portrait으로 전환하는 방법입니다. 참고하세요.
헷갈려 하시는 분이 계신 것 같아 더 자세히 설명 드리겠습니다..
총 4번의 스텝을 거쳐주셔야합니다.
1. 우선 메니페스트 내의 39번째 라인 부근에 보시면 <uses-feature android:name="android.hardware.screen.landscape"/>
부분을 <uses-feature android:name="android.hardware.screen.portrait"/>로 변경해 줍니다.
메니페스트의 60번째 라인을 보시면 CaptureActivity 액티비티의 screen orientation을 portrait으로 변경해줍니다.
CameraManager 클래스의 openDriver() 함수로 가셔서 theCamera = Camera.open(); 아래쪽에
theCamera.setDisplayOrientation(90); 을 추가시켜줍니다.
2. 카메라와 액티비티를 세로모드로 전환했어도 사진을 통해 찍힌 이미지는 여전히 가로입니다.
사진을 찍은 후 얻은 byte[] data를 세로로 전환해 줍니다.
DecodeHandler.java로 가시면 activity.getCameraManager().buildLuminanceSource(data, width, height);
를 호출하는 부분이 있을 겁니다. 그 이전 라인에 아래와 같이 추가해 줍니다.
byte[] rotatedData = new byte[data.length];
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++)
rotatedData[x * height + height - y - 1] = data[x + y * width];
}
int tmp = width;
width = height;
height = tmp;
byte[]data를 회전하여 rotatedData에 저장하고 width와 height를 스왑해 줍니다.
그리고 buildLuminanceSource(rotatedData, width, height); 와 같이 바뀌어진 인자 값을 넘겨줍니다.
3. CameraManager.java로 다시 가셔서 getFramingRectInPreview()의 rect 관련 부분을 아래와 같이 바꿔 줍니다.
rect.left = rect.left * cameraResolution.y / screenResolution.x;
rect.right = rect.right * cameraResolution.y / screenResolution.x;
rect.top = rect.top * cameraResolution.x / screenResolution.y;
rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;
4.CameraConfigurationManager의 getCameraResolution()과 getScreenResolution()을
아래와 같이 수정합니다.
Point getCameraResolution() {
int tmp = cameraResolution.x;
cameraResolution.x = cameraResolution.y;
cameraResolution.y = tmp;
return cameraResolution;
}
Point getScreenResolution() {
int tmp = screenResolution.x;
screenResolution.x = screenResolution.y;
screenResolution.y = tmp;
return screenResolution;
}
이렇게 하면 세로모드로 완벽하게 바뀝니다...
추가사항
- CameraConfigurationManager 클래스에 setDesiredCameraParameters() 메소드에
Camera.Parameters parameters = camera.getParameters(); 구문이 존재합니다.
그 아래쪽에 아래와 같이 추가해주세요..
parameters.set("orientation", "portrait");
- PlanarYUVLuminanceSource 클래스의 45번째 라인에
if (left + width > dataWidth || top + height > dataHeight) {throw new IllegalArgumentException("Crop rectangle does not fit within image
data."); }
위 부분을 모두 주석처리 해줍니다.
2012.09.03 15:58:36
맨 아래 두부분 이런식으로 수정해야 합니다...
계속 호출되는데 로테이션 되서 에러 나오네여
Point getScreenResolution() {
if(rotateScreenResolution == null){
rotateScreenResolution = new Point(screenResolution.y, screenResolution.x);
}
return rotateScreenResolution;
}
getCameraResolution(){]
2012.09.04 09:28:06
이거 적용해보니 몇가지 더 수정해야 하네요;;;
돌려지기는 하는데 돌려진 상태에 따른 이미지 처리라던가...
지금으로써는 정상적으로 돌아간다고 할 수는 없을거 같네요 음...
2012.10.23 15:42:03
마지막 getScreenResolution이랑 getCameraResolution을 수정하지 않고 CameraConfigurationManager의 initFromCameraParameters에서 if (width < height) 안의 내용을 주석 처리 하시면 제대로 인식은 하지만 Camera 화질이 구려지네요.. 위의 주석 대충 읽어보니 우리는 Landscape만 지원해서 Portrait로 되어있으면 Landscape로 가정하고 한다.. 이런 내용인거 같은데 맞나요(제가 영어를 못해서;;)
Camera Resolution 정의하는 findBestPreviewSizeValue에서는 portrait일 경우도 정의 한거 같은데 흠..
좋은 정보 감사합니다.~~~