http://blog.csdn.net/jtujtujtu/article/details/3874621
YUY2經常用於電視制式以及許多攝像頭的輸出格式.而我們在處理時經常需要將其轉化為RGB進行處理,這裡簡單介紹下YUY2(YUV)與RGB之間相互轉化的關系:
http://msdn2.microsoft.com/en-us/library/ms893078.aspx
YUY2(YUV) To RGB:
C = Y - 16
D = U - 128
E = V - 128
R = clip(( 298 * C + 409 * E + 128) >> 8) G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8) B = clip(( 298 * C + 516 * D + 128) >> 8)
其中 clip()為限制函數,將其取值限制在0-255之間.
RGB To YUY2(YUV):
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 上述兩個公式在代碼中的 int YUV2RGB(void* pYUV, void* pRGB, int width, int height, bool alphaYUV, bool alphaRGB); int RGB2YUV(void* pRGB, void* pYUVX, int width, int height, bool alphaYUV, bool alphaRGB); 函數中轉換。 在諸如攝像頭的數據獲取中,我們往往需要直接在YUY2(YUV)空間上進行一些圖象處理,我們希望能夠在YUY2 (YUV)進行一些RGB上可以做到的處理。這裡已blending為例,將兩張帶有透明度的YUY2(YUV)圖片進行疊加, 以達到在RGB空間進行圖像合成的效果。 RGB空間進行圖像疊加,通常背景(BG)是不透明的,而前景(FG)是帶有透明度的。在RGB空間,可以簡單表示為: Rdest = Rfg*alpha + Rbg*(1-alpha); Gdest = Gfg*alpha + Gbg*(1-alpha); Bdest = Bfg*alpha + Bbg*(1-alpha); // Rdest、Gdest、Bdest 為最終合成後的像素值 考慮到 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 我們可以推導出 (Ydest-16)<<8 = ((Yfg-16)<<8)*alpha + ((Ybg-16)<<8)*(1-alpha); (Udest-128)<<8 = ((Ufg-128)<<8)*alpha + ((Ubg-128)<<8)*(1-alpha); (Vdest-128)<<8 = ((Vfg-128)<<8)*alpha + ((Vbg-128)<<8)*(1-alpha); 從而可以得到 Ydest = (Yfg-16)*alpha + (Ybg-16)*(1-alpha) + 16; Udest = (Ufg-128)*alpha + (Ubg-128)*(1-alpha) + 128; Vdest = (Vfg-128)*alpha + (Vbg-128)*(1-alpha) + 128; 這個疊加過程在函數 int YUVBlending(void* pBGYUV, void* pFGYUV, int width, int height, bool alphaBG, bool alphaFG) 中實現。 由於本文針對攝像頭采集所得的數據進行處理,因此數據為YUY2格式,即4個字節來表示兩個像素點的YUV信息, 排列為Y1 U1 Y2 V2, 對於像素點1為(Y1, U1, V1),像素點2為(Y2, U1, V1)。即兩個像素點共用U、V信息。 這裡假設帶有alpha透明度的YUV格式用6個字節來表示兩個像素點的YUV以及alpha信息,排列為 Y1 U1 Y2 V1 alpha1 alpha2 其中像素點1為(Y1, U1, V1, alpha1),像素點2為(Y2, U1, V1, alpha2)。其中alpha為對應點的透明度信息。 而帶有alpha透明度RGB格式的圖片,假設為32bits的BMP圖片,每個像素點用4bytes來表示,分別為B G R alpha信息。 上述函數的具體實現為:經測試,功能已經實現,如有錯誤或者不妥的地方,懇請指出。 mosesyuan at gmail dot com
- //////////////////////////////////////////////////////////////////////////
- // YUV2RGB
- // pYUV point to the YUV data
- // pRGB point to the RGB data
- // width width of the picture
- // height height of the picture
- // alphaYUV is there an alpha channel in YUV
- // alphaRGB is there an alpha channel in RGB
- //////////////////////////////////////////////////////////////////////////
- int YUV2RGB(void* pYUV, void* pRGB, int width, int height, bool alphaYUV, bool alphaRGB)
- {
- if (NULL == pYUV)
- {
- return -1;
- }
- unsigned char* pYUVData = (unsigned char *)pYUV;
- unsigned char* pRGBData = (unsigned char *)pRGB;
- if (NULL == pRGBData)
- {
- if (alphaRGB)
- {
- pRGBData = new unsigned char[width*height*4];
- }
- else
- pRGBData = new unsigned char[width*height*3];
- }
- int Y1, U1, V1, Y2, alpha1, alpha2, R1, G1, B1, R2, G2, B2;
- int C1, D1, E1, C2;
- if (alphaRGB)
- {
- if (alphaYUV)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y1 = *(pYUVData+i*width*3+j*6);
- U1 = *(pYUVData+i*width*3+j*6+1);
- Y2 = *(pYUVData+i*width*3+j*6+2);
- V1 = *(pYUVData+i*width*3+j*6+3);
- alpha1 = *(pYUVData+i*width*3+j*6+4);
- alpha2 = *(pYUVData+i*width*3+j*6+5);
- C1 = Y1-16;
- C2 = Y2-16;
- D1 = U1-128;
- E1 = V1-128;
- R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);
- G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);
- B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);
- R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);
- G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);
- B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);
- *(pRGBData+(height-i-1)*width*4+j*8+2) = R1<0 ? 0 : R1;
- *(pRGBData+(height-i-1)*width*4+j*8+1) = G1<0 ? 0 : G1;
- *(pRGBData+(height-i-1)*width*4+j*8) = B1<0 ? 0 : B1;
- *(pRGBData+(height-i-1)*width*4+j*8+3) = alpha1;
- *(pRGBData+(height-i-1)*width*4+j*8+6) = R2<0 ? 0 : R2;
- *(pRGBData+(height-i-1)*width*4+j*8+5) = G2<0 ? 0 : G2;
- *(pRGBData+(height-i-1)*width*4+j*8+4) = B2<0 ? 0 : B2;
- *(pRGBData+(height-i-1)*width*4+j*8+7) = alpha2;
- }
- }
- }
- else
- {
- int alpha = 255;
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y1 = *(pYUVData+i*width*2+j*4);
- U1 = *(pYUVData+i*width*2+j*4+1);
- Y2 = *(pYUVData+i*width*2+j*4+2);
- V1 = *(pYUVData+i*width*2+j*4+3);
- C1 = Y1-16;
- C2 = Y2-16;
- D1 = U1-128;
- E1 = V1-128;
- R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);
- G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);
- B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);
- R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);
- G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);
- B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);
- *(pRGBData+(height-i-1)*width*4+j*8+2) = R1<0 ? 0 : R1;
- *(pRGBData+(height-i-1)*width*4+j*8+1) = G1<0 ? 0 : G1;
- *(pRGBData+(height-i-1)*width*4+j*8) = B1<0 ? 0 : B1;
- *(pRGBData+(height-i-1)*width*4+j*8+3) = alpha;
- *(pRGBData+(height-i-1)*width*4+j*8+6) = R2<0 ? 0 : R2;
- *(pRGBData+(height-i-1)*width*4+j*8+5) = G2<0 ? 0 : G2;
- *(pRGBData+(height-i-1)*width*4+j*8+4) = B2<0 ? 0 : B2;
- *(pRGBData+(height-i-1)*width*4+j*8+7) = alpha;
- }
- }
- }
- }
- else
- {
- if (alphaYUV)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y1 = *(pYUVData+i*width*3+j*4);
- U1 = *(pYUVData+i*width*3+j*4+1);
- Y2 = *(pYUVData+i*width*3+j*4+2);
- V1 = *(pYUVData+i*width*3+j*4+3);
- C1 = Y1-16;
- C2 = Y2-16;
- D1 = U1-128;
- E1 = V1-128;
- R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);
- G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);
- B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);
- R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);
- G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);
- B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);
- *(pRGBData+(height-i-1)*width*3+j*6+2) = R1<0 ? 0 : R1;
- *(pRGBData+(height-i-1)*width*3+j*6+1) = G1<0 ? 0 : G1;
- *(pRGBData+(height-i-1)*width*3+j*6) = B1<0 ? 0 : B1;
- *(pRGBData+(height-i-1)*width*3+j*6+5) = R2<0 ? 0 : R2;
- *(pRGBData+(height-i-1)*width*3+j*6+4) = G2<0 ? 0 : G2;
- *(pRGBData+(height-i-1)*width*3+j*6+3) = B2<0 ? 0 : B2;
- }
- }
- }
- else
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y1 = *(pYUVData+i*width*2+j*4);
- U1 = *(pYUVData+i*width*2+j*4+1);
- Y2 = *(pYUVData+i*width*2+j*4+2);
- V1 = *(pYUVData+i*width*2+j*4+3);
- C1 = Y1-16;
- C2 = Y2-16;
- D1 = U1-128;
- E1 = V1-128;
- R1 = ((298*C1 + 409*E1 + 128)>>8>255 ? 255 : (298*C1 + 409*E1 + 128)>>8);
- G1 = ((298*C1 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C1 - 100*D1 - 208*E1 + 128)>>8);
- B1 = ((298*C1+516*D1 +128)>>8>255 ? 255 : (298*C1+516*D1 +128)>>8);
- R2 = ((298*C2 + 409*E1 + 128)>>8>255 ? 255 : (298*C2 + 409*E1 + 128)>>8);
- G2 = ((298*C2 - 100*D1 - 208*E1 + 128)>>8>255 ? 255 : (298*C2 - 100*D1 - 208*E1 + 128)>>8);
- B2 = ((298*C2 + 516*D1 +128)>>8>255 ? 255 : (298*C2 + 516*D1 +128)>>8);
- *(pRGBData+(height-i-1)*width*3+j*6+2) = R1<0 ? 0 : R1;
- *(pRGBData+(height-i-1)*width*3+j*6+1) = G1<0 ? 0 : G1;
- *(pRGBData+(height-i-1)*width*3+j*6) = B1<0 ? 0 : B1;
- *(pRGBData+(height-i-1)*width*3+j*6+5) = R2<0 ? 0 : R2;
- *(pRGBData+(height-i-1)*width*3+j*6+4) = G2<0 ? 0 : G2;
- *(pRGBData+(height-i-1)*width*3+j*6+3) = B2<0 ? 0 : B2;
- }
- }
- }
- }
- return 0;
- }
- //////////////////////////////////////////////////////////////////////////
- // RGB2YUV
- // pRGB point to the RGB data
- // pYUV point to the YUV data
- // width width of the picture
- // height height of the picture
- // alphaYUV is there an alpha channel in YUV
- // alphaRGB is there an alpha channel in RGB
- //////////////////////////////////////////////////////////////////////////
- int RGB2YUV(void* pRGB, void* pYUV, int width, int height, bool alphaYUV, bool alphaRGB)
- {
- if (NULL == pRGB)
- {
- return -1;
- }
- unsigned char* pRGBData = (unsigned char *)pRGB;
- unsigned char* pYUVData = (unsigned char *)pYUV;
- if (NULL == pYUVData)
- {
- if (alphaYUV)
- {
- pYUVData = new unsigned char[width*height*3];
- }
- else
- pYUVData = new unsigned char[width*height*2];
- }
- int R1, G1, B1, R2, G2, B2, Y1, U1, Y2, V1;
- int alpha1, alpha2;
- if (alphaYUV)
- {
- if (alphaRGB)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- B1 = *(pRGBData+(height-i-1)*width*4+j*8);
- G1 = *(pRGBData+(height-i-1)*width*4+j*8+1);
- R1 = *(pRGBData+(height-i-1)*width*4+j*8+2);
- alpha1 = *(pRGBData+(height-i-1)*width*4+j*8+3);
- B2 = *(pRGBData+(height-i-1)*width*4+j*8+4);
- G2 = *(pRGBData+(height-i-1)*width*4+j*8+5);
- R2 = *(pRGBData+(height-i-1)*width*4+j*8+6);
- alpha2 = *(pRGBData+(height-i-1)*width*4+j*8+7);
- Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
- U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
- Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
- V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
- *(pYUVData+i*width*3+j*6) = Y1;
- *(pYUVData+i*width*3+j*6+1) = U1;
- *(pYUVData+i*width*3+j*6+2) = Y2;
- *(pYUVData+i*width*3+j*6+3) = V1;
- *(pYUVData+i*width*3+j*6+4) = alpha1;
- *(pYUVData+i*width*3+j*6+5) = alpha2;
- }
- }
- }
- else
- {
- unsigned char alpha = 255;
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- B1 = *(pRGBData+(height-i-1)*width*3+j*6);
- G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);
- R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);
- B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);
- G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);
- R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);
- Y1 = ((66*R1+129*G1+25*B1+128)>>8) + 16;
- U1 = ((-38*R1-74*G1+112*B1+128)>>8+(-38*R2-74*G2+112*B2+128)>>8)/2 + 128;
- Y2 = ((66*R2+129*G2+25*B2+128)>>8) + 16;
- V1 = ((112*R1-94*G1-18*B1+128)>>8 + (112*R2-94*G2-18*B2+128)>>8)/2 + 128;
- Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
- U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
- Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
- V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
- *(pYUVData+i*width*3+j*6) = Y1;
- *(pYUVData+i*width*3+j*6+1) = U1;
- *(pYUVData+i*width*3+j*6+2) = Y2;
- *(pYUVData+i*width*3+j*6+3) = V1;
- *(pYUVData+i*width*3+j*6+4) = alpha;
- *(pYUVData+i*width*3+j*6+5) = alpha;
- }
- }
- }
- }
- else
- {
- if (alphaRGB)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- B1 = *(pRGBData+(height-i-1)*width*4+j*8);
- G1 = *(pRGBData+(height-i-1)*width*4+j*8+1);
- R1 = *(pRGBData+(height-i-1)*width*4+j*8+2);
- B2 = *(pRGBData+(height-i-1)*width*4+j*8+4);
- G2 = *(pRGBData+(height-i-1)*width*4+j*8+5);
- R2 = *(pRGBData+(height-i-1)*width*4+j*8+6);
- Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
- U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
- Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
- V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
- *(pYUVData+i*width*2+j*4) = Y1;
- *(pYUVData+i*width*2+j*4+1) = U1;
- *(pYUVData+i*width*2+j*4+2) = Y2;
- *(pYUVData+i*width*2+j*4+3) = V1;
- }
- }
- }
- else
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- B1 = *(pRGBData+(height-i-1)*width*3+j*6);
- G1 = *(pRGBData+(height-i-1)*width*3+j*6+1);
- R1 = *(pRGBData+(height-i-1)*width*3+j*6+2);
- B2 = *(pRGBData+(height-i-1)*width*3+j*6+3);
- G2 = *(pRGBData+(height-i-1)*width*3+j*6+4);
- R2 = *(pRGBData+(height-i-1)*width*3+j*6+5);
- Y1 = (((66*R1+129*G1+25*B1+128)>>8) + 16) > 255 ? 255 : (((66*R1+129*G1+25*B1+128)>>8) + 16);
- U1 = ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128)>255 ? 255 : ((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2 + 128);
- Y2 = (((66*R2+129*G2+25*B2+128)>>8) + 16)>255 ? 255 : ((66*R2+129*G2+25*B2+128)>>8) + 16;
- V1 = ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128)>255 ? 255 : ((((112*R1-94*G1-18*B1+128)>>8) + ((112*R2-94*G2-18*B2+128)>>8))/2 + 128);
- *(pYUVData+i*width*2+j*4) = Y1;
- *(pYUVData+i*width*2+j*4+1) = U1;
- *(pYUVData+i*width*2+j*4+2) = Y2;
- *(pYUVData+i*width*2+j*4+3) = V1;
- }
- }
- }
- }
- return 0;
- }
- //////////////////////////////////////////////////////////////////////////
- // pGBYUV point to the background YUV data
- // pFGYUV point to the foreground YUV data
- // width width of the picture
- // height height of the picture
- // alphaBG is there an alpha channel in background YUV data
- // alphaFG is there an alpha channel in fourground YUV data
- //////////////////////////////////////////////////////////////////////////
- int YUVBlending(void* pBGYUV, void* pFGYUV, int width, int height, bool alphaBG, bool alphaFG)
- {
- if (NULL == pBGYUV || NULL == pFGYUV)
- {
- return -1;
- }
- unsigned char* pBGData = (unsigned char*)pBGYUV;
- unsigned char* pFGData = (unsigned char*)pFGYUV;
- if (!alphaFG)
- {
- if (!alphaBG)
- {
- memcpy(pBGData, pFGData, width*height*2);
- }
- else
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- *(pBGData+i*width*2+j*4) = *(pFGData+i*width*2+j*4);
- *(pBGData+i*width*2+j*4+1) = *(pFGData+i*width*2+j*4+1);
- *(pBGData+i*width*2+j*4+2) = *(pFGData+i*width*2+j*4+2);
- *(pBGData+i*width*2+j*4+3) = *(pFGData+i*width*2+j*4+3);
- }
- }
- }
- }
- int Y11, U11, V11, Y12, Y21, U21, V21, Y22;
- int alpha1, alpha2;
- if (!alphaBG)
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y11 = *(pBGData+i*width*2+j*4);
- U11 = *(pBGData+i*width*2+j*4+1);
- Y12 = *(pBGData+i*width*2+j*4+2);
- V11 = *(pBGData+i*width*2+j*4+3);
- Y21 = *(pFGData+i*width*3+j*6);
- U21 = *(pFGData+i*width*3+j*6+1);
- Y22 = *(pFGData+i*width*3+j*6+2);
- V21 = *(pFGData+i*width*3+j*6+3);
- alpha1 = *(pFGData+i*width*3+j*6+4);
- alpha2 = *(pFGData+i*width*3+j*6+5);
- *(pBGData+i*width*2+j*4) = (Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
- *(pBGData+i*width*2+j*4+1) = ((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255 + (U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
- *(pBGData+i*width*2+j*4+3) = ((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255 + (V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
- *(pBGData+i*width*2+j*4+2) = (Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
- }
- }
- }
- else
- {
- for (int i=0; i<height; ++i)
- {
- for (int j=0; j<width/2; ++j)
- {
- Y11 = *(pBGData+i*width*3+j*6);
- U11 = *(pBGData+i*width*3+j*6+1);
- Y12 = *(pBGData+i*width*3+j*6+2);
- V11 = *(pBGData+i*width*3+j*6+3);
- Y21 = *(pFGData+i*width*3+j*6);
- U21 = *(pFGData+i*width*3+j*6+1);
- Y22 = *(pFGData+i*width*3+j*6+2);
- V21 = *(pFGData+i*width*3+j*6+3);
- alpha1 = *(pFGData+i*width*3+j*6+4);
- alpha2 = *(pFGData+i*width*3+j*6+5);
- *(pBGData+i*width*3+j*6) = (Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
- *(pBGData+i*width*3+j*6+1) = ((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255 + (U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
- *(pBGData+i*width*3+j*6+3) = ((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255 + (V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
- *(pBGData+i*width*3+j*6+2) = (Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
- }
- }
- }
- return 0;
- }