如何根据现有的yuv2rgb方法编写rgb2yuv?

时间:2017-07-07 08:37:56

标签: android

我接手了一个Android项目,该项目已经有一个 yuv2rgb 方法。我必须写这个方法 rgb2yuv 。请帮帮我,谢谢!

public static int[] yuv2rgb(byte[] pYUV, int width, int height) {
    int[] pRGB = new int[width * height];
    int i, j, yp;
    int hfWidth = width >> 1;
    int size = width * height;
    int qtrSize = size >> 2;
    for (i = 0, yp = 0; i < height; i++) {
        int uvp = size + (i >> 1) * hfWidth, u = 0, v = 0;
        for (j = 0; j < width; j++, yp++) {
            int y = (0xff & pYUV[yp]) - 16;
            if ((j & 1) == 0) {
                u = (0xff & pYUV[uvp + (j >> 1)]) - 128;
                v = (0xff & pYUV[uvp + qtrSize + (j >> 1)]) - 128;
            }

            int y1192 = 1192 * y;
            int r = (y1192 + 1634 * v);
            int g = (y1192 - 833 * v - 400 * u);
            int b = (y1192 + 2066 * u);

            if (r < 0) r = 0;
            else if (r > 262143) r = 262143;
            if (g < 0) g = 0;
            else if (g > 262143) g = 262143;
            if (b < 0) b = 0;
            else if (b > 262143) b = 262143;

            pRGB[i * width + j] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff);
        }
    }
    return pRGB;
}

1 个答案:

答案 0 :(得分:0)

我的同事帮我找到了办法,这是有效的!

public static byte[] colorconvertRGB_IYUV_I420(int[] aRGB, int width, int height) {
    final int frameSize = width * height;
    final int chromasize = frameSize / 4;

    int yIndex = 0;
    int uIndex = frameSize;
    int vIndex = frameSize + chromasize;
    byte[] yuv = new byte[width * height * 3 / 2];

    int a, R, G, B, Y, U, V;
    int index = 0;
    for (int j = 0; j < height; j++) {
        for (int i = 0; i < width; i++) {

            //a = (aRGB[index] & 0xff000000) >> 24; //not using it right now
            R = (aRGB[index] & 0xff0000) >> 16;
            G = (aRGB[index] & 0xff00) >> 8;
            B = (aRGB[index] & 0xff) >> 0;

            Y = ((66 * R + 129 * G + 25 * B + 128) >> 8) + 16;
            U = ((-38 * R - 74 * G + 112 * B + 128) >> 8) + 128;
            V = ((112 * R - 94 * G - 18 * B + 128) >> 8) + 128;

            yuv[yIndex++] = (byte) ((Y < 0) ? 0 : ((Y > 255) ? 255 : Y));

            if (j % 2 == 0 && index % 2 == 0) {
                yuv[uIndex++] = (byte) ((U < 0) ? 0 : ((U > 255) ? 255 : U));
                yuv[vIndex++] = (byte) ((V < 0) ? 0 : ((V > 255) ? 255 : V));
            }

            index++;
        }
    }
    return yuv;
}