프로그래밍/Android

[Android] zxing 세로모드 (QR Code Reader)

프리월드 2012. 7. 6. 17:09

[Android] zxing 세로모드 (QR Code Reader)|작성자 택이  

http://space5084.blog.me/60162210955


QR코드를 써야할일이 생겨서 오픈소스를 찾던 중 zxing라는 오픈소스를 발견.


그중에서 아이님의 블로그에 포스팅된 소스를 이용합니다. - http://bit.ly/K1kYTh


앱상에서 이용할때에는 세로모드용으로 써야했기 때문에 


베이스가 가로모드인 상태에서 카메라만 돌려버리게 되면 인식률이 현저히 떨어지게 됩니다.


세로모드로 전환시 카메라 프리뷰영역이 가로세로 전환이 되지 않았기 때문입니다.


해당 스텝대로 진행하고 나면 세로모드를 하더라도 제대로 인식되는걸 볼수있을겁니다.


1. 우선 메니페스트파일에서 android:screenOrientation를 landscape로 바꾸어줍니다.

- 그런다음 바로 실행하면 화면은 돌아갔으나 카메라는 여전히 가로인 상태라서 이상하게 나올겁니다.


2CameraConfigurationManager.java에서 setDesiredCameraParameters()메소드에 해당코드를 추가해줍니다.

    camera.setDisplayOrientation(90); 

- 이부분을 추가하게되면 카메라도 실제로 돌아가서 제대로 보일겁니다. 하지만 인식률은 아직 좋지않습니다. 


3DecodeHandler.java에서 decode()메소드에 해당 코드를 추가합니다.

1 byte[] rotatedData = new byte[data.length]; 2 for (int y = 0; y < height; y++) { 3 for (int x = 0; x < width; x++) 4 rotatedData[x * height + height - y - 1] = data[x + y * width]; 5 } 6 int tmp = width; 7 width = height; 8 height = tmp;

그런다음 buildLuminanceSource를 호출할때 인자로 data가 아닌 rotateData를 전달되도록 바꿉니다.

PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(rotatedData, width, height);


4. 마지막으로 CameraManager.java에서 getFramingRectInPreview()메소드안에 코드를

1 rect.left = rect.left * cameraResolution.y / screenResolution.x; 2 rect.right = rect.right * cameraResolution.y / screenResolution.x; 3 rect.top = rect.top * cameraResolution.x / screenResolution.y; 4 rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

로 바꿔줍니다. cameraResolution의 x와 y를 바꿔준것입니다.


이제 실행을 해보면 카메라프리뷰영역으로 qrcode가 제대로 인식될것입니다.

제대로 세로모드에 대한 포스팅이 없어 조금 삽질을하다가 해결하게 되어 포스팅해둡니다.