1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
void ClassImg::RGBtoYUV(LPBYTE pdest, LPBYTE psrc, DWORD w, LPBYTE m_AChannel)
{
LPBYTE dst = pdest;
LPBYTE src = psrc;
LPBYTE Ach = m_AChannel;
DWORD w2 = w >> 1;
while (w2--)
{
int B = *src++;
int G = *src++;
int R = *src++;
if (Ach) *Ach++ = *src++;
int Y = ((long)(219l* 77*R + 219l*150*G + 219l* 29*B)>>16)+16;
int U = ((long)(219l*131*B - 219l* 87*G - 219l* 44*R)>>16)+128;
#define clip(x) (((x) & 0xffffff00) ? ((x) & 0x80000000) ? 0 : 255 : (x))
*dst++ = clip(U);
*dst++ = clip(Y);
B = *src++;
G = *src++;
R = *src++;
if (Ach) *Ach++ = *src++;
Y = ((long)(219l* 77*R + 219l*150*G + 219l* 29*B)>>16)+16;
int V = ((long)(219l*131*R - 219l*110*G - 219l* 21*B)>>16)+128;
*dst++ = clip(V);
*dst++ = clip(Y);
}
} |
Partager