偏色我遇到过,锯齿到没见过,这是我的 YUV 转换过程void MCCameraClass::YUY2toRGB( int lpPicW, int lpPicH, WORD lpYUY2ColorSize, DWORD lpYUY2ByteSize, WORD lpBmpColorSize, DWORD lpBmpByteSize, BYTE *lpYUY2Bytes, BYTE *lpBmpBytes) { LONG ColorR1 = 0; LONG ColorG1 = 0; LONG ColorB1 = 0; LONG ColorR2 = 0; LONG ColorG2 = 0; LONG ColorB2 = 0; LONG cY0 = 0; LONG cY1 = 0; LONG cU = 0; LONG cV = 0; LONG x = 0; LONG y = 0; LONG i = 0; LONG BitmapBytesX = 0; LONG BitmapBytesY = 0; LONG BitmapByteWidthSize = 0; LONG YUVBytesX = 0; LONG YUVBytesY = 0; LONG YUY2ByteWidthSize = 0; LONG RGBGray = 0; YUY2ByteWidthSize = lpYUY2ByteSize/(LONG)lpPicH; BitmapByteWidthSize = lpBmpByteSize/(LONG)lpPicH; for(y=0; y<(LONG)lpPicH; y++){ for(x=0; x<(LONG)lpPicW; x++){ BitmapBytesX = x * (LONG)lpBmpColorSize; BitmapBytesY = y * BitmapByteWidthSize; if((LONG)lpYUY2ColorSize==2){ YUVBytesX = x * (LONG)lpYUY2ColorSize; YUVBytesY = y * YUY2ByteWidthSize;
int lpPicH,
WORD lpYUY2ColorSize,
DWORD lpYUY2ByteSize,
WORD lpBmpColorSize,
DWORD lpBmpByteSize,
BYTE *lpYUY2Bytes,
BYTE *lpBmpBytes)
{
LONG ColorR1 = 0;
LONG ColorG1 = 0;
LONG ColorB1 = 0;
LONG ColorR2 = 0;
LONG ColorG2 = 0;
LONG ColorB2 = 0;
LONG cY0 = 0;
LONG cY1 = 0;
LONG cU = 0;
LONG cV = 0;
LONG x = 0;
LONG y = 0;
LONG i = 0;
LONG BitmapBytesX = 0;
LONG BitmapBytesY = 0;
LONG BitmapByteWidthSize = 0;
LONG YUVBytesX = 0;
LONG YUVBytesY = 0;
LONG YUY2ByteWidthSize = 0;
LONG RGBGray = 0; YUY2ByteWidthSize = lpYUY2ByteSize/(LONG)lpPicH;
BitmapByteWidthSize = lpBmpByteSize/(LONG)lpPicH; for(y=0; y<(LONG)lpPicH; y++){
for(x=0; x<(LONG)lpPicW; x++){
BitmapBytesX = x * (LONG)lpBmpColorSize;
BitmapBytesY = y * BitmapByteWidthSize;
if((LONG)lpYUY2ColorSize==2){
YUVBytesX = x * (LONG)lpYUY2ColorSize;
YUVBytesY = y * YUY2ByteWidthSize;
cY0 = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 0];
cU = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 1];
cY1 = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 2];
cV = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 3] ; cY0 = cY0 - (LONG)16;
cY1 = cY1 - (LONG)16;
cU = cU - (LONG)128;
cV = cV - (LONG)128; if(cY0>(LONG)255){ cY0=(LONG)255; }else if(cY0<(LONG)0){ cY0=(LONG)0; }
if(cY1>(LONG)255){ cY1=(LONG)255; }else if(cY1<(LONG)0){ cY1=(LONG)0; } ColorR1 = (LONG)((cY0 * (LONG)298 + cV * (LONG)409 + (LONG)128)>>(LONG)8);
ColorG1 = (LONG)((cY0 * (LONG)298 - cU * (LONG)100 - cV * (LONG)208 + (LONG)128)>>(LONG)8);
ColorB1 = (LONG)((cY0 * (LONG)298 + cU * (LONG)516 + (LONG)128)>>(LONG)8); ColorR2 = (LONG)((cY1 * (LONG)298 + cV * (LONG)409 + (LONG)128)>>(LONG)8);
ColorG2 = (LONG)((cY1 * (LONG)298 - cU * (LONG)100 - cV * (LONG)208 + (LONG)128)>>(LONG)8);
ColorB2 = (LONG)((cY1 * (LONG)298 + cU * (LONG)516 + (LONG)128)>>(LONG)8);
if(ColorR1>(LONG)255){ColorR1=(LONG)255;}else if(ColorR1<(LONG)0){ColorR1=(LONG)0;}
if(ColorG1>(LONG)255){ColorG1=(LONG)255;}else if(ColorG1<(LONG)0){ColorG1=(LONG)0;}
if(ColorB1>(LONG)255){ColorB1=(LONG)255;}else if(ColorB1<(LONG)0){ColorB1=(LONG)0;}
if(ColorR2>(LONG)255){ColorR2=(LONG)255;}else if(ColorR2<(LONG)0){ColorR2=(LONG)0;}
if(ColorG2>(LONG)255){ColorG2=(LONG)255;}else if(ColorG2<(LONG)0){ColorG2=(LONG)0;}
if(ColorB2>(LONG)255){ColorB2=(LONG)255;}else if(ColorB2<(LONG)0){ColorB2=(LONG)0;}
lpBmpBytes[BitmapBytesY + BitmapBytesX + 0] = (BYTE)ColorB1;
lpBmpBytes[BitmapBytesY + BitmapBytesX + 1] = (BYTE)ColorG1;
lpBmpBytes[BitmapBytesY + BitmapBytesX + 2] = (BYTE)ColorR1;
lpBmpBytes[BitmapBytesY + BitmapBytesX + 3] = (BYTE)ColorB2;
lpBmpBytes[BitmapBytesY + BitmapBytesX + 4] = (BYTE)ColorG2;
lpBmpBytes[BitmapBytesY + BitmapBytesX + 5] = (BYTE)ColorR2;
x++; }else if((LONG)lpYUY2ColorSize>=3){
YUVBytesX = x * (LONG)lpYUY2ColorSize;
YUVBytesY = ((LONG)lpPicH - (y + 1)) * YUY2ByteWidthSize;
for(i=0; i<(LONG)lpYUY2ColorSize; i++){
lpBmpBytes[BitmapBytesY + BitmapBytesX + i] = lpYUY2Bytes[YUVBytesX + YUVBytesY + i];
}
}
}
}}