RGB2YUV(BYTE * rgb, BYTE * yuv) { unsigned char R, G, B, *y, *u, *v; double RR, GG, BB; y = yuv; u = y + m_nHeight * m_nWidth; v = y + m_nHeight * m_nWidth * 3 / 2; // convert: the m_pBits is stored in BOTTOMUP // so read data from back to forward, // from down to up for (int r = 0; r < m_nHeight; ++r) { unsigned char * p = (BYTE*)m_pBits + (r * m_nPitch); for (int c = 0; c < m_nWidth; ++c) { int q = c * 3; B = *(p + q); G = *(p + q + 1); R = *(p + q + 2); //normalize to 16 ..235// RR = 219. * R / 255. + 16.; GG = 219. * G / 255. + 16.; BB = 219. * B / 255. + 16.; *y = (BYTE)(0.2991 * RR + 0.5849 * GG + 0.1159 * BB + .5); *u = (BYTE)(-0.1725 * RR - 0.3372 * GG + 0.5097 * BB + 128.5); *v = (BYTE)(0.5097 * RR - 0.4254 * GG - 0.0843 * BB + 128.5); y++; c & 1 ? v++:u++; } } }
|