2011-08-05 33 views
2

私はYUV 4:2:2形式の画像を表示するスクリーングラバーを持っています。C#でYUV 4:2:2をRGBに変換しますか?

byte []を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

あなただけ

を呼び出し、YUVから変換するために、RGBのクラスで静的メソッドを使用してRGB、YUV、HSB、HSLおよび他の多くのカラーフォーマット、例から変換すること this libraryを使用することができます
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); 
    } 

あなたは、RGBのバイト配列内の値を埋めるためにPixelYUV2RGB関数を使用します。

これは、上記よりもはるかに高速ですが、正確に何をしたい行うコードhere、しかしのバイト順序があり、C#

+1

-1)A)サイト[ソース](http://msdn.microsoft.com/en-us/library/aa917087.aspx) B)これはYUV 4:4:4ではなく4:2:2に変換されます – pelesl

0

でフルHD映像のためのパフォーマンスの面でまだサブパーですRGBビットマップが反転されます(赤と青を交換します)。

関連する問題