Confusão na conversão YUV NV21 para RGB
De acordo comhttp://developer.android.com/reference/android/graphics/ImageFormat.html#NV21, NV21 é o formato usado padrão.
Há um grande número de códigos na web sobre a conversão YUV NV21 para RGB. No entanto, quando eu passar pelo código, duvido da correção do código.
O primeiro componente V deve vir primeiro, seguido pelo primeiro componente U
De acordo comhttp://wiki.videolan.org/YUV#NV21, NV21 is like NV12, but with U and V order reversed: it starts with V.
No entanto, quando eu passei pela implementação do código
R deve ser a posição mais significativa De acordo com a implementação deint argb
emColor.java, R suponha que esteja na posição mais significativa. No entanto, passei pela seguinte implementação de código
Eu estava pensando, eles estão cometendo um erro comum, ou eu esqueci de algo?
Atualmente, minha implementação é a seguinte.
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;
}
}
}