본문 바로가기

나의 플랫폼/안드로이드

[ Android ] Camera 캡쳐된 화면 보여주기.

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이번에 Camera 연동 부분이 있어 조사를 좀 했습니다.

조사 해본 결과 첫번째 캡쳐된 이미지를 가져오는 방법이


 mCamera.setPreviewCallback(new Camera.PreviewCallback() {

public void onPreviewFrame(byte[] data, Camera camera) {

Camera.Parameters params = mCamera.getParameters();

                        int w = params.getPreviewSize().width;

                        int h = params.getPreviewSize().height;

                        int format = params.getPreviewFormat();

                        YuvImage image = new YuvImage(data, format, w, h, null);


                        ByteArrayOutputStream out = new ByteArrayOutputStream();

                        Rect area = new Rect(0, 0, w, h);

                        image.compressToJpeg(area, 50, out);

                        captureImg = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

        }

});

위와 같이 Camera에서 매번 Preview를 호출 할때 이 Callback함수를 부르게 됩니다.

이때 넘어오는 데이터를 중간에 가로채어 Bitmap으로 변환 시키는 거죠.

출처 : http://blog.naver.com/PostView.nhn?blogId=sungwooks&logNo=20150204580


하지만, 전 Preview 상태에서 여러 동작을 할려면 매번 호출할 때마다  Image 로딩에 어려움이 있었습니다.

아마 위소스를 쓰레드로 제어하면 문제 없이 Image를 호출할 수 있지만,

제가 해보고자 하는 내용은 그냥 Camera에서 사진을 찍으면 찍은 사진만 그대로 보여주는 것이었습니다.

이럴 경우 다른 게 필요 없이 한 함수만 부르면 됩니다.

mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);

그럼 Camera가 사진을 찍게 되어 그 결과물이 화면에 그대로 보여지게 됩니다.


이때!!!!!!!!!!!!!!!!!!!! 문제점.

Camera Parameter에는 두가지 사이즈를 정해 놓습니다. 

바로 PreviewSize와 PictureSize 입니다. 

PreviewSize는 Preview 상태에서 Camera를 통해 보여지는 사이즈 이며,

PictureSize는 takepicture함수를 실행한 후, 생긴 사진 이미지의 사이즈 입니다.


두 사이즈가 일치 하지 않을 경우 사진이 좀 찌그러지는 현상이 발생합니다.

출처: http://blog.naver.com/PostView.nhn?blogId=dnakeye&logNo=100131758666&redirect=Dlog&widgetTypeCall=true


그래서 두 사이즈를 조절하기 위해 ApiDemo에 있는 Camera소스를 그대로 약간의 수정을 한 내용이 있습니다.

public void surfaceCreated(SurfaceHolder holder) {

        // The Surface has been created, acquire the camera and tell it where

        // to draw.

        try {

            if (mCamera != null) {

                mCamera.setPreviewDisplay(holder);

                

                // 카메라에서 찍을 수 있는 모든 사이즈를 가지고 와서 그중에 하나를 선택한다.

                Camera.Parameters parameters = mCamera.getParameters();

                List<Size> sizes = parameters.getSupportedPictureSizes();

                Size optimalSize;

                optimalSize = getOptimalPreviewSize(sizes, mPreviewSize.width, mPreviewSize.height);

                parameters.setPictureSize(optimalSize.width, optimalSize.height);  

                mCamera.setParameters(parameters);

            }

        } catch (IOException exception) {

            Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);

        }

    }


출처 : http://blog.naver.com/PostView.nhn?blogId=dythmall&logNo=30096952693&parentCategoryNo=8&viewDate=&currentPage=1&listtype=0


이러 부분만 넣어주면 문제 없이 출력이 됩니다.

이걸로.. 2~3시간 날린 것 같습니다.ㅠㅠ


사진 이미지를 가져와 Bitmap이나 파일로 저장하는 것은 구글링 하면 많은 자료들이 있습니다.

그럼 오늗도 즐코딩!!