2013-01-05 74 views
2

我將NV21爲RGB的單個像素,這是我做的:NV21在RGB轉換結果黑白

public int getYUVvalue(byte[] yuv,int width,int height,int x,int y){ 
     int total=width*height; 
    int Y=(0xff&yuv[y*width+x])-16; 
    int U=(0xff&yuv[(y/2)*(width/2)+(x/2)+total])-128; 
    int V=(0xff&yuv[(y/2)*(width/2)+(x/2)+total+1])-128; 
    return this.convertYUVtoRGB(Y, U, V); 

    } 
private static int convertYUVtoRGB(int y, int u, int v) { 


     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; 


     return 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff); 
    } 

但結果是隻有黑和白,看起來像U和V價值不正確,有人可以幫我解決這個問題嗎? 謝謝!

更新:我確認我的Y值是正確的,所以我認爲問題是在U和V值,我不知道問題出在哪裏。 更新#2:我的代碼與decodeYUV420sp()非常相似,它是一個廣泛使用的函數來轉換整個圖像,它完美的工作,我的只是轉換一個像素,仍然試圖通過比較來找出問題用我的代碼。這裏是decodeyuv420sp功能:

static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) { 
     final int frameSize = width * height; 

     for (int j = 0, yp = 0; j < height; j++) { 
     int uvp = frameSize + (j >> 1) * width, u = 0, v = 0; 
     for (int i = 0; i < width; i++, yp++) { 
      int y = (0xff & ((int) yuv420sp[yp])) - 16; 
      if (y < 0) y = 0; 
      if ((i & 1) == 0) { 
       v = (0xff & yuv420sp[uvp++]) - 128; 
       u = (0xff & yuv420sp[uvp++]) - 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; 

      rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) & 0xff); 
     } 
    } 
    } 

我仍然無法看到我的錯誤是。

更新#3:問題解決了,謝謝大家的幫助!

+1

U和V的值是什麼? – Simon

+0

u和v值都在-30和30之間 –

+0

有人嗎?請幫助我,謝謝 –

回答

2

getYUVvalue函數中的U & V的數組索引邏輯與decodeYUV420SP中的邏輯不匹配。 (我數3間的區別。)如果沒有這種格式,我不能確定測試樣品字節數組,但我認爲它應該是:

int U=(0xff&yuv[(y/2)*width+(x&~1)+total+1])-128; 
int V=(0xff&yuv[(y/2)*width+(x&~1)+total])-128; 

它缺少if (y < 0) y = 0;檢查也。也許這很重要。

+0

問題已經解決了你的建議,非常感謝你 –