2012-01-31 76 views
0

我試圖水平鏡像libswscale PIX_FMT_YUYV422類型的圖像。每個像素使用16位每行的簡單循環會導致顏色錯誤,例如藍色對象爲橙色。這是我的代碼:如何鏡像swscale PIX_FMT_YUYV422

typedef unsigned short YUVPixel; // 16 bits per pixel 
    for (int y = 0; y < outHeight; y++) 
    { 
     YUVPixel *p1 = (YUVPixel*)pBits + y * outWidth; 
     YUVPixel *p2 = p1 + outWidth - 1; 
     for (int x = 0; x < outWidth/2; x++) // outWidth is image width in pixels 
     { 
      // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr 
      unsigned short tmp; 
      tmp = *p1; 
      *p1 = *p2; 
      *p2 = tmp; 
     } 
    } 

然後我試圖重新定義YUVPixel爲32位的類型和相應地修改我的循環。這導致正確的顏色,但看起來像相鄰像素交換。任何想法,我完全失去了這個?

回答

0

使用32位YUVPixel型好你的方法,你只需要確保你換的是像素結構中的兩個Y值移動它的後面,例如:

Y0 U Y1 V 
       move to new position  
      --------------------------------> 
              Y0 U Y1 V 
               <swap> 
              Y1 U Y0 V 

U和V值兩者都適用於整個2像素結構,Y值必須翻轉。