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;
}
YUV转RGB
最新推荐文章于 2022-05-30 12:18:33 发布