YUV NV21转换为RGB的困惑

Che*_*eng 32 android nv12-nv21

根据http://developer.android.com/reference/android/graphics/ImageFormat.html#NV21,NV21是默认使用的格式.

网上有很多关于YUV NV21到RGB转换的代码.但是,当我查看代码时,我怀疑代码的正确性.

第一个组分V应首先出现,然后是第一个组分U.

根据http://wiki.videolan.org/YUV#NV21,NV21 is like NV12, but with U and V order reversed: it starts with V.但是,当我完成代码实现时

[R应该是最显著位置 的根据实施int argbColor.java,R假设是在最显著位置.但是,我经历了以下代码实现

我想知道,他们是否犯了常见错误,或者我忽略了什么?

目前,我的实施如下.

public static void YUV_NV21_TO_RGB(int[] argb, byte[] yuv, int width, int height) {
    final int frameSize = width * height;

    final int ii = 0;
    final int ij = 0;
    final int di = +1;
    final int dj = +1;

    int a = 0;
    for (int i = 0, ci = ii; i < height; ++i, ci += di) {
        for (int j = 0, cj = ij; j < width; ++j, cj += dj) {
            int y = (0xff & ((int) yuv[ci * width + cj]));
            int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0]));
            int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1]));
            y = y < 16 ? 16 : y;

            int r = (int) (1.164f * (y - 16) + 1.596f * (v - 128));
            int g = (int) (1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
            int b = (int) (1.164f * (y - 16) + 2.018f * (u - 128));

            r = r < 0 ? 0 : (r > 255 ? 255 : r);
            g = g < 0 ? 0 : (g > 255 ? 255 : g);
            b = b < 0 ? 0 : (b > 255 ? 255 : b);

            argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Vic*_*nin 12

首先,我对图像编码没有超级经验(大约一年前对此有一定的了解).所以,我的答案是盐.

但是,我相信你是对的.我认为在他们的代码中,a)V和U都被翻转b)R和B被翻转

我有一种感觉,当这些东西都被翻转时,它会产生相同的结果,好像它们没有被翻转一样.这就是为什么你可以在许多地方找到错误的代码的原因(最初,有人弄错了,并且在整个地方复制之后,因为生成的代码有效(但是,变量命名不正确)).

这是另一个代码示例(与您的代码相同):http: //www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array