본문 바로가기
영상처리

RGBA to NV21

by 붕어사랑 티스토리 2023. 6. 2.
반응형

https://learn.microsoft.com/ko-kr/windows/win32/medfound/recommended-8-bit-yuv-formats-for-video-rendering

 

비디오 렌더링에 권장되는 8비트 YUV 형식 - Win32 apps

비디오 렌더링에 권장되는 8비트 YUV 형식

learn.microsoft.com

 

toDataURL로 넘어온 데이터를 비트맵으로 바꾼 다음에 변환하는 코드. rgba가 바로 있다면 윗부분을 잘라서 알아서 쓰면 됩니다.

색상 포맷의 정의는 위 코드를 참고하면 된다. NV21 또는 yuv420sp의 경우 아래 코드에서 uv만 바꿔주면 됨!

 

 

public byte[] convertBitmapToYUV(String base64Data) {
        byte[] decodedBytes = Base64.decode(base64Data.split(";base64,")[1], Base64.DEFAULT);
        Bitmap bitmap = BitmapFactory.decodeByteArray(decodedBytes,0,decodedBytes.length);
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] pixels = new int[width * height];
        Log.d(TAG,"minhaeng converted width x height "+width+","+height);
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

        byte[] yuvData = new byte[width * height * 3 / 2];
        int inputIndex = 0;
        int yIndex = 0;
        int uvIndex = width * height;

        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                int pixel = pixels[inputIndex++];
                int r = Color.red(pixel);
                int g = Color.green(pixel);
                int b = Color.blue(pixel);

                int yValue = (int) (0.299 * r + 0.587 * g + 0.114 * b);
                int uValue = (int) (-0.14713 * r - 0.28886 * g + 0.436 * b);
                int vValue = (int) (0.615 * r - 0.51498 * g - 0.10001 * b);

                yuvData[yIndex++] = (byte) yValue;

                if (y % 2 == 0 && x % 2 == 0) {
                    yuvData[uvIndex++] = (byte) (uValue + 128);
                    yuvData[uvIndex++] = (byte) (vValue + 128);
                }
            }
        }
        return yuvData;
    }
반응형

댓글