YUVtoRGB

来源:互联网 发布:python 异步io 编辑:程序博客网 时间:2024/06/03 09:28
void ConvertYUVtoRGB(unsigned char *y,unsigned char *u,unsigned char *v,unsigned char *out,int w)
{
int i,iTempR,iTempG,iTempB,iTempY,iTempU,iTempV;
for(i=0;i
{
iTempY=y[i];
//读取UV分量,在水平方向每2个象素点共用1组UV
iTempU=u[i>>1]-128;
iTempV=v[i>>1]-128;
//YUV->RGB
iTempR=(short)(iTempY+1.375*iTempV);
iTempG=(short)(iTempY-0.34375*iTempU-0.703125*iTempV);
iTempB=(short)(iTempY+1.734375*iTempU);
//输出,每个分量的范围要保证在0-255之间
out[i*3+0]=max(0,min(255,iTempB));
out[i*3+1]=max(0,min(255,iTempG));
out[i*3+2]=max(0,min(255,iTempR));
}
}
void YUV420toRGB24(unsigned char *pBuf,unsigned char *pRgb,UINT uiW,UINT uiH)
{
unsigned char * pYUV420Y,*pYUV420U,*pYUV420V,*pLineY,*pLineU,*pLineV,*pLineBmp;
// 420->rgb24
pYUV420Y = pBuf; //Y分量,水平:w 垂直:h
pYUV420U = pBuf + uiW*uiH; //U分量,水平:w/2 垂直:h
pYUV420V = pBuf + uiW*uiH +uiW*uiH/4; //V分量,水平:w/2 垂直:h

for (int i =0; i<(int)uiH; i++)
{
pLineY = pYUV420Y+i*uiW; //当前行的Y输入
pLineU = pYUV420U+(i/2)*(uiW/2); //当前行的U输入
pLineV = pYUV420V+(i/2)*(uiW/2); //当前行的V输入
//当前行的输入,在BMP图像中,图像在垂直方向上,需要至下而上反向排列,所以要从后向前输出BMP数据
pLineBmp = pRgb + (long int)uiW*(uiH-i-1)*3;
ConvertYUVtoRGB(pLineY, pLineU, pLineV, pLineBmp, uiW);
}
}

ios视频监控demo低价出售 QQ:1530591908
0 0
原创粉丝点击