求助:UYVY422格式转为RGB
在网上下载过UYVY422转RGB的例子,不知道是不是对的,反正在我这边转出来是乱的。
我先描述一下情况:
是隔行扫描的,但是别人给了一个库,专门用于将两场合并为一场,并生成UYVY422格式,
由我的DirectDraw显示,我的DirectDraw显示格式设置成了dwFourCC = MAKEFOURCC('U', 'Y', 'V', 'Y');
这样做可以正常显示,没问题。
我现在需要截图,也就是将这个UYVY422格式的数据转为RGB再保存为bmp,奇怪为什么不行。
我想问的就是DirectDraw能够显示的UYVY格式数据,按理说它这个格式应该是规范的才对吧,
那我将UYVY按规范转为RGB为什么就不对呢?
//yuv->bmp
//输入:yuvin-yuv图像数据, width-图像像素宽度, height-图像像素高度
//输出:rgbout-bmp图像数据
bool CScreenShot::UYVY422ToRGB(int width, int height, BYTE *yuvin, BYTE *rgbout)
{
if (NULL == yuvin || NULL == rgbout)
{
return false;
}
int col,row;
long Y,U,V;
long red,blue,green;
for (row=0; row<height; row++)
{
int idx=((height-row-1)*3)*width;
int rowptr=row*width;
for (col=0; col<width; col++)
{
int colhalf=col>>1;
Y=yuvin[rowptr+col];
U=yuvin[rowptr+colhalf+width*height-row*width/2];
V=yuvin[rowptr+colhalf+width*height-row*width/2+width*height/2];
red=(int)(Y+(U-128)*1.375);
green=(int)(Y-(U-128)*0.34375-(V-128)*0.703125);
blue=(int)(Y+(V-128)*1.734375);
if (red>255) red=255;
else if (red<0) red=0;
if (green>255) green=255;
else if (green<0) green=0;
if (blue>255) blue=255;
else if (blue<0) blue=0;
rgbout[idx++]=(char)red;
rgbout[idx++]=(char)green;
rgbout[idx++]=(char)blue;
}
}
return true;
}
初学,请高手赐教