2011-08-05 90 views
2

我有一个屏幕抓取器,它给了我一个YUV 4:2:2格式的图像。c#将YUV 4:2:2转换为RGB?

我需要将我的字节[]的RGB格式?

请帮帮忙, 杰森

+0

你读过这个吗? http://en.wikipedia.org/wiki/YUV#Conversion_to.2Ffrom_RGB :) –

+0

这也应该是有用的:[在YUV和RGB之间转换](http://msdn.microsoft.com/en-us/library /ms893078.aspx) –

回答

2

您可以使用this library使用的RGB类中的静态方法从YUV转换,从RGB,YUV,HSB,HSL等众多色彩格式,例如转换,只需调用

RGB rgb = RBB.YUVtoRBG(y, u, v); 

和底层执行它:

public static RGB YUVtoRGB(double y, double u, double v) 
{ 
    RGB rgb = new RGB(); 

    rgb.Red = Convert.ToInt32((y + 1.139837398373983740*v)*255); 
    rgb.Green = Convert.ToInt32((
     y - 0.3946517043589703515*u - 0.5805986066674976801*v)*255); 
    rgb.Blue = Convert.ToInt32((y + 2.032110091743119266*u)*255); 

    return rgb; 
} 
+1

这会忽略宏像素。 –

0

使用整数仅计算中的溶液(即,应比浮点/双精度计算更快)是:

static byte asByte(int value) 
    { 
     //return (byte)value; 
     if (value > 255) 
      return 255; 
     else if (value < 0) 
      return 0; 
     else 
      return (byte)value; 
    } 

    static unsafe void PixelYUV2RGB(byte * rgb, byte y, byte u, byte v) 
    { 
     int C = y - 16; 
     int D = u - 128; 
     int E = v - 128; 

     rgb[2] = asByte((298 * C + 409 * E + 128) >> 8); 
     rgb[1] = asByte((298 * C - 100 * D - 208 * E + 128) >> 8); 
     rgb[0] = asByte((298 * C + 516 * D + 128) >> 8); 
    } 

这里使用PixelYUV2RGB功能的字节数组用于RGB填补值。

这比上述快得多,但仍低于平均水平在性能方面的全高清图像在C#

+1

-1 A)将您的[sources](http://msdn.microsoft.com/en-us/library/aa917087.aspx)网站; B)从YUV 4:4:4转换而不是4:2:2 – pelesl

0

有代码here做你想要什么,但对于字节顺序RGB位图被倒置(交换红色和蓝色)。