YUV转RGB

    技术2022-05-19  17

    void   CColorSpaceConvector::YUV2RGB(BYTE   *   pDest,   BYTE   *   pSrc,   DWORD   dwRGBBit,       DWORD   dwDestPitch,   DWORD   dwSrcPitch,         int   nHeight,   UINT   nWidth) { UINT   nLength   =   nWidth   *   ((dwRGBBit   +   7)   /   8); if   (nHeight   <=   0) { nHeight   =   -nHeight; switch   (dwRGBBit) { case   15: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; UINT   b   =   Trunc((y   < <   8)   +   n1)   > >   11; UINT   g   =   Trunc((y   < <   8)   +   n2)   > >   11; UINT   r   =   Trunc((y   < <   8)   +   n3)   > >   11; *(WORD*)(pDest   +   j)   =   (WORD)   ((r   < <   10)   |   (g   < <   5)   |   b); y   =   pSrc[k+2]; b   =   Trunc((y   < <   8)   +   n1)   > >   11; g   =   Trunc((y   < <   8)   +   n2)   > >   11; r   =   Trunc((y   < <   8)   +   n3)   > >   11; *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   < <   10)   |   (g   < <   5)   |   b); } pSrc   +=   dwSrcPitch; pDest   +=   dwDestPitch; } } break; case   16: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; UINT   b   =   Trunc((y   < <   8)   +   n1)   > >   11; UINT   g   =   Trunc((y   < <   8)   +   n2)   > >   10; UINT   r   =   Trunc((y   < <   8)   +   n3)   > >   11; *(WORD*)(pDest   +   j)   =   (WORD)   ((r   < <   11)   |   (g   < <   5)   |   b); y   =   pSrc[k+2]; b   =   Trunc((y   < <   8)   +   n1)   > >   11; g   =   Trunc((y   < <   8)   +   n2)   > >   10; r   =   Trunc((y   < <   8)   +   n3)   > >   11; *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   < <   11)   |   (g   < <   5)   |   b); } pSrc   +=   dwSrcPitch; pDest   +=   dwDestPitch; } } break; case   24: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   6,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; pDest[j     ]   =   (BYTE)   (Trunc((y   < <   8)   +   n1)   > >   8); pDest[j+1]   =   (BYTE)   (Trunc((y   < <   8)   +   n2)   > >   8); pDest[j+2]   =   (BYTE)   (Trunc((y   < <   8)   +   n3)   > >   8); y   =   pSrc[k+2]; pDest[j+3]   =   (BYTE)   (Trunc((y   < <   8)   +   n1)   > >   8); pDest[j+4]   =   (BYTE)   (Trunc((y   < <   8)   +   n2)   > >   8); pDest[j+5]   =   (BYTE)   (Trunc((y   < <   8)   +   n3)   > >   8); } pSrc   +=   dwSrcPitch; pDest   +=   dwDestPitch; } } break; case   32: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   8,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT n1=511*u-6*v-64522; UINT n2=48838-125*u-255*v; UINT n3=506*v-u-64522; pDest[j     ]   =   (BYTE)   (Trunc((y   < <   8)   +   n1)   > >   8); pDest[j+1]   =   (BYTE)   (Trunc((y   < <   8)   +   n2)   > >   8); pDest[j+2]   =   (BYTE)   (Trunc((y   < <   8)   +   n3)   > >   8); pDest[j+3]   =   0; y   =   pSrc[k+2]; pDest[j+4]   =   (BYTE)   (Trunc((y   < <   8)   +   n1)   > >   8); pDest[j+5]   =   (BYTE)   (Trunc((y   < <   8)   +   n2)   > >   8); pDest[j+6]   =   (BYTE)   (Trunc((y   < <   8)   +   n3)   > >   8); pDest[j+7]   =   0; } pSrc   +=   dwSrcPitch; pDest   +=   dwDestPitch; } } break; } } else { pDest   +=   (nHeight   -   1)   *   dwDestPitch; switch   (dwRGBBit) { case   15: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT   b   =   Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   11; UINT   g   =   Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   11; UINT   r   =   Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   11; *(WORD*)(pDest   +   j)   =   (WORD)   ((r   < <   10)   |   (g   < <   5)   |   b); y   =   pSrc[k+2]; b   =   Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   11; g   =   Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   11; r   =   Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   11; *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   < <   10)   |   (g   < <   5)   |   b); } pSrc   +=   dwSrcPitch; pDest   -=   dwDestPitch; } } break; case   16: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   4,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; UINT   b   =   Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   11; UINT   g   =   Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   10; UINT   r   =   Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   11; *(WORD*)(pDest   +   j)   =   (WORD)   ((r   < <   11)   |   (g   < <   5)   |   b); y   =   pSrc[k+2]; b   =   Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   11; g   =   Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   10; r   =   Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   11; *(WORD*)(pDest   +   j   +   2)   =   (WORD)   ((r   < <   11)   |   (g   < <   5)   |   b); } pSrc   +=   dwSrcPitch; pDest   -=   dwDestPitch; } } break; case   24: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   6,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; pDest[j     ]   =   (BYTE)   (Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   8); pDest[j+1]   =   (BYTE)   (Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   8); pDest[j+2]   =   (BYTE)   (Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   8); y   =   pSrc[k+2]; pDest[j+3]   =   (BYTE)   (Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   8); pDest[j+4]   =   (BYTE)   (Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   8); pDest[j+5]   =   (BYTE)   (Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   8); } pSrc   +=   dwSrcPitch; pDest   -=   dwDestPitch; } } break; case   32: { for   (UINT   i   =   0;   i   <   (UINT)   nHeight;   i++) { for   (UINT   j   =   0,   k   =   0;   j   <   nLength;   j   +=   8,   k   +=   4) { UINT   y   =   pSrc[k]; UINT   u   =   pSrc[k+1]; UINT   v   =   pSrc[k+3]; pDest[j     ]   =   (BYTE)   (Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   8); pDest[j+1]   =   (BYTE)   (Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   8); pDest[j+2]   =   (BYTE)   (Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   8); pDest[j+3]   =   0; y   =   pSrc[k+2]; pDest[j+4]   =   (BYTE)   (Trunc((y   < <   8)   +   511   *   u   -   6   *   v   -   64522)   > >   8); pDest[j+5]   =   (BYTE)   (Trunc((y   < <   8)   -   125   *   u   -   255   *   v   +   48838)   > >   8); pDest[j+6]   =   (BYTE)   (Trunc((y   < <   8)   -   u   +   506   *   v   -   64522)   > >   8); pDest[j+7]   =   0; } pSrc   +=   dwSrcPitch; pDest   -=   dwDestPitch; } } break; }


    最新回复(0)