24位的RGB图片数据转化成YUV422数据,之前截图的,可以再优化下RGB2YUV函数,不再用浮点数据做运算能节省CPU
y = (299 * r + 587 * g + 117 * b) / 1000
u = (-1687* r + 3313* g + 5000 * b ) / 10000 + 128
v = (5000* r - 4187 * g - 813 * b) / 10000 + 128
void RGB2YUV(unsigned char r, unsigned char g, unsigned char b,unsigned char &y, unsigned char &u, unsigned char &v)
{
y = 0.299 * r + 0.587 * g + 0.114 * b;
u = -0.1687 * r - 0.3313 * g + 0.5 * b + 128;
v = 0.5 * r - 0.4187 * g -0.0813 * b + 128;
}
void RGB24TOYUV422(unsigned char *pRgb, int w, int h, unsigned char *pYuv)
{
w = w / 2 * 2;
for(int height = 0; height < h; height ++)
{
unsigned char *ptrRGB = pRgb + height * w * 3;
unsigned char *ptrYUV = pYuv + height * w * 2;
for(int width = 0; width < w ; width += 2)
{
unsigned char y1, u1, v1, y2, u2, v2, r1, g1, b1, r2, g2, b2;
r1 = *ptrRGB;
ptrRGB++;
g1 = *ptrRGB;
ptrRGB++;
b1 = *ptrRGB;
ptrRGB++;
r2 = *ptrRGB;
ptrRGB++;
g2 = *ptrRGB;
ptrRGB++;
b2 = *ptrRGB;
ptrRGB++;
RGB2YUV(r1, g1, b1, y1, u1, v1);
RGB2YUV(r2, g2, b2, y2, u2, v2);
//u、v分量取平均值
unsigned char u = (u1 + u2) / 2;
unsigned char v = (v1 + v2) / 2;
*ptrYUV = y1;
ptrYUV++;
*ptrYUV= u;
ptrYUV++;
*ptrYUV= y2;
ptrYUV++;
*ptrYUV= v;
ptrYUV++;
}
}
}