在解码完成后,得到YUV数据,我用DirectDraw再显示到窗口上,发现,只要有活动的物体,他的周围就是马赛克和锯齿,这个一般是什么原因造成的?

解决方案 »

  1.   

    是ddraw显示出的问题,还是原始图象就是有马赛克哦
      

  2.   

    偏色我遇到过,锯齿到没见过,这是我的 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;

    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];
                 }
    }
    }
    }}
      

  3.   

    恩,不是ddraw问题,是原始数据问题