본문 바로가기
프로그래밍/Android-Java

[ANDROID] byte array rotate

by 채연2 2021. 1. 27.

앱을 landscape로 실행시켰더니 카메라도 같이 돌아가버렸다...

 

camera.setDisplayOrientation(90);

위와 같이 설정을 해도 보이는 화면만 돌아가있지 막상 bitmap을 찍어서 보면 적용이 안되어있어서 골머리를 썩히다가 방법을 찾았다 !

 

카메라 onPreviewFrame에서 들어오는 byte array 데이터를 돌리면 된다 !

 

public static byte[] rotateNV21(byte[] input, int width, int height, int rotation) {
        byte[] output = new byte[input.length];

        try {
            if (rotation == 0) {
                System.arraycopy(input, 0, output, 0, input.length);
                return null;
            }
            boolean swap = (rotation == 90 || rotation == 270);
            boolean yflip = (rotation == 90 || rotation == 180);
            boolean xflip = (rotation == 270 || rotation == 180);
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    int xo = x, yo = y;
                    int w = width, h = height;
                    int xi = xo, yi = yo;
                    if (swap) {
                        xi = w * yo / h;
                        yi = h * xo / w;
                    }
                    if (yflip) {
                        yi = h - yi - 1;
                    }
                    if (xflip) {
                        xi = w - xi - 1;
                    }
                    output[w * yo + xo] = input[w * yi + xi];
                    int fs = w * h;
                    int qs = (fs >> 2);
                    xi = (xi >> 1);
                    yi = (yi >> 1);
                    xo = (xo >> 1);
                    yo = (yo >> 1);
                    w = (w >> 1);
                    h = (h >> 1);
                    // adjust for interleave here
                    int ui = fs + (w * yi + xi) * 2;
                    int uo = fs + (w * yo + xo) * 2;
                    // and here
                    int vi = ui + 1;
                    int vo = uo + 1;
                    output[uo] = input[ui];
                    output[vo] = input[vi];
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return output;
    }

위의 함수를 이용하여 아래처럼 변환해주면 끝 !!

 

rotateNV21(bytes, previewWidth, previewHeight, 90)

저 맨 위의 camera.setDisplayOrientation도 같이 설정해줘야 보이는 화면도 돌아간다 !!

 

 

또다른 문제는.......... 프레임 속도가 느려진다는거 ㅜ,ㅜ 해결할 방법을 찾으러 가야겠다..

320x100

댓글