我正在使用以下代码片段创建虚拟YUV420图像。我想使用Y,U和V组件以RGB格式创建相同图像的副本。
我将YUV上的Wiki条目引用到RGB转换,但它没有提供与YUV相同的图像。 有什么建议吗?
修改: img
是RGB32格式(ARGB)的QImage。
这是YUV420图片:
这是RGB转换提供的内容:
int clamp(int val){
if(val>255) return 255;
if(val<0) return 0;
return val;
}
-----
int h=height;
int w=width;
for(y=0;y<h ;y++){
for(x=0;x<w;x++){
int hy=y/2;
int hx=x/2;
//Populate YUV420 image
char compY=x+y+i*3; //Y component
char compU=128+hy+(i)*2; //U component
char compV=64+hx+(i)*5; //V component
//encoder.setInputPicturePixelData(0,y* l0+x,compY);
//encoder.setInputPicturePixelData(1,hy*l1+hx,compU); //encoder.setInputPicturePixelData(2,hy*l2+hx,compV);
//encoder.setInputPicturePixelData(2,hy*l2+hx,compV);
//Now create the RGB image
char R=clamp(compY+1.402*(compV-128));
char G=clamp(compY-0.3444*(compU-128)-0.714*(compV-128));
char B=clamp(compY+1.772*(compU-128));
int RGBval=0xFF<<24 | R<<16 | G<<8 | B;
img->setPixel(x,y,RGBval);
}
}
答案 0 :(得分:1)
首先,img
是什么?它本身可能有问题,可能是以错误的方式放置数据。它可能期望R,G,B值以相反的顺序(B <&lt; 16)或零alpha位。
另一件事是R
,G
,B
是8位值,而你正在将它们转移得太多。你应该这样做:
int RGBval= (0xFF << 24) | ((unsigned int) R << 16) | ((unsigned int) G << 8) | B;
答案 1 :(得分:1)
char compY=x+y+i*3
中的我是什么;
什么是YUV420图片的FourCC代码。仅使用YUV420,我们无法知道图片是packed formats or planar formats
答案 2 :(得分:1)
char compY = x + y + i * 3;
您的图片宽度为359像素,您不会检查x或y是否在[0..255]范围内。该值可能会溢出并回绕。
int RGBval = 0xFF&lt;&lt; 24 | R&lt; 16 G <&lt; 8 | B;
Qt有qRgb和qRgba功能。您应该使用它们而不是自己编写宏。
char R = clamp(compY + 1.402 *(compV-128));
在C ++中,char通常是签名,并将valus存储在范围[-128..127]
中。因此,如果从任何正char值中减去128,您将获得负数。这可能不是你想要的。
Innstead of char
使用quint8
,unsigned char
或uint8_t
。