capFileSaveDIB是保存在硬盘上的,请问如何保存在内存中呢?
求代码,直接从lpHDr->lpData中的YUV2数据进行保存。

解决方案 »

  1.   

    YUV的数据转换为rgb就可以
      

  2.   

    //注意RGB的缓冲区得是YUV2的1.5贝,因为一个YUV2包含两个像素, 所以需要两个RGB像素表示
    void YUY2_RGB( BYTE *YUY2buff, BYTE *RGBbuff, DWORD dwYUVSize )
    {
    //Algorithm:
    //R = 1.164(Y - 16) + 2.018(U - 128)
    //G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
    //B = 1.164(Y - 16) + 1.596(V - 128) //R = Y + 1.403V
    //G = Y - 0.344U' - 0.714V
    //B = Y + 1.770U
    int R, G, B;
    float Y, U, Y1, V;
    BYTE *poriYUV2buff = YUY2buff;
    BYTE *poriRGBbuff = RGBbuff;

    for ( DWORD i = 0; i < dwYUVSize; i += 4 )
    {
    //1. 获取Y U V 数值, 
    //YUV2格式的排列是Y0,V0,Y1,U0,  Y2,V2,Y3,U2 
    Y  = *YUY2buff;
    U  = *(++YUY2buff);
    Y1 = *(++YUY2buff);
    V  = *(++YUY2buff);
    ++YUY2buff; //2. 计算 R G B 值
    R = 1.164f * ( Y - 16 ) + 2.018f * ( U - 128 );
    G = 1.164f * ( Y - 16 ) - 0.813f * ( V - 128 ) - 0.391f * ( U - 128 );
    B = 1.164f * ( Y - 16 ) + 1.596f * ( V - 128 ); //3. 溢出处理
    if ( R > 255 )  R = 255; if ( R < 0 ) R = 0;
    if ( G > 255 )  R = 255; if ( G < 0 ) R = 0;
    if ( B > 255 )  R = 255; if ( B < 0 ) R = 0; //4. 输出 R G B
    //一个YUV2包含两个像素, 所以需要两个RGB像素表示
    *(RGBbuff) = (byte)R;
    *(++RGBbuff) = (byte)G;
    *(++RGBbuff) = (byte)B; *(++RGBbuff) = (byte)R;
    *(++RGBbuff) = (byte)G;
    *(++RGBbuff) = (byte)B; ++RGBbuff;
    } YUY2buff = poriYUV2buff;
    RGBbuff = poriRGBbuff;
    }