Android 프로그래밍 2

본문 바로가기
사이트 내 전체검색


Android 프로그래밍 2
Android 프로그래밍 2

10. 카메라 가로보기를 세로보기로 바꾸기

페이지 정보

작성자 관리자 댓글 0건 조회 3,451회 작성일 20-06-28 22:44

본문

10. 카메라 가로보기를 세로보기로 바꾸기

수정할 파일은 CameraBridgeViewBase.java 입니다. 

1.PNG


private final Matrix mMatrix = new Matrix();


private void updateMatrix() {

    float mw = this.getWidth();

    float mh = this.getHeight();


    float hw = this.getWidth() / 2.0f;

    float hh = this.getHeight() / 2.0f;


    float cw  = (float)Resources.getSystem().getDisplayMetrics().widthPixels; //Make sure to import Resources package

    float ch  = (float)Resources.getSystem().getDisplayMetrics().heightPixels;


    float scale = cw / (float)mh;

    float scale2 = ch / (float)mw;

    if(scale2 > scale){

        scale = scale2;

    }


    boolean isFrontCamera = mCameraIndex == CAMERA_ID_FRONT;


    mMatrix.reset();

    if (isFrontCamera) {

        mMatrix.preScale(-1, 1, hw, hh); //MH - this will mirror the camera

    }

    mMatrix.preTranslate(hw, hh);

    if (isFrontCamera){

        mMatrix.preRotate(270);

    } else {

        mMatrix.preRotate(90);

    }

    mMatrix.preTranslate(-hw, -hh);

    mMatrix.preScale(scale,scale,hw,hh);

}


@Override

public void layout(int l, int t, int r, int b) {

    super.layout(l, t, r, b);

    updateMatrix();

}


@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    updateMatrix();

}


/**

* This method shall be called by the subclasses when they have valid

* object and want it to be delivered to external client (via callback) and

* then displayed on the screen.

* @param frame - the current frame to be delivered

*/

protected void deliverAndDrawFrame(CvCameraViewFrame frame) { //replaces existing deliverAndDrawFrame

    Mat modified;


    if (mListener != null) {

        modified = mListener.onCameraFrame(frame);

    } else {

        modified = frame.rgba();

    }


    boolean bmpValid = true;

    if (modified != null) {

        try {

            Utils.matToBitmap(modified, mCacheBitmap);

        } catch(Exception e) {

            Log.e(TAG, "Mat type: " + modified);

            Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());

            Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());

            bmpValid = false;

        }

    }


    if (bmpValid && mCacheBitmap != null) {

        Canvas canvas = getHolder().lockCanvas();

        if (canvas != null) {

            canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);

            int saveCount = canvas.save();

            canvas.setMatrix(mMatrix);


            if (mScale != 0) {

                canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),

                        new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),

                                (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),

                                (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),

                                (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);

            } else {

                canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),

                        new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,

                                (canvas.getHeight() - mCacheBitmap.getHeight()) / 2,

                                (canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),

                                (canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);

            }


            //Restore canvas after draw bitmap

            canvas.restoreToCount(saveCount);


            if (mFpsMeter != null) {

                mFpsMeter.measure();

                mFpsMeter.draw(canvas, 20, 30);

            }

            getHolder().unlockCanvasAndPost(canvas);

        }

    }

}

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.