2009-11-15 5 views
9

Wie führe ich RGB-> YUV Konvertierung in C/C++ durch?Wie führe ich RGB-> YUV Konvertierung in C/C++ durch?

ich einige Bitmap haben .. RGB muss ich es konvertieren

Libs auf YUV? Tuts? Artikel?

+4

's/mit actionscript/in C \/C++ /' macht es nicht zu einer neuen Frage http://stackoverflow.com/questions/1737712/how-to-perform-rgb-yuv-conversion-with-actionscript – voyager

+1

Sie möchten einen RGB-Wert in YUV ändern? Oder ändern Sie eine RGB-Bitmap in eine YUV-Datei? Sie möchten eine Bilddateikonvertierung vornehmen, oder? – voyager

+0

Ich bin sicher, dass es eine Möglichkeit gibt, diese Arbeit auf die gfx-Karte zu übertragen. Diese Art von Operation ist perfekt für die Grafikkarte. – fishfood

Antwort

-3
+0

Die Frage, wie die Konvertierung in C/C++ durchgeführt wird. ImageMagick ist natürlich C++, aber hier sind keine Funktionen dargestellt (plus ImageMagick ist unter einer eigenen Lizenz), also habe ich Leszeks Antwort abgelehnt. –

17

prüfen Sie diesen Artikel: http://www.fourcc.org/fccyvrgb.php Conversion ist ganz einfach, so dass Sie wahrscheinlich Ihre eigene Funktion auf der Grundlage dieser

Y =  (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 

Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128 

Previously answered for ActionScript

+0

Hallo Voyager ich brauche Hilfe, ich habe meinen Code, der yv12-> rgb565 ist, abgeladen. Genauso muss ich für yuv444 zu rgb888 arbeiten. Bitte führen Sie mich. Sie können meine letzte Frage für die Funktion sehen, die yuv12-> rgb565 konvertiert. – Abhineet

+1

Beachten Sie, dass es mehrere Standards gibt, die den Farbraum steuern, den Sie in einer Yuv-Datei finden können (zB BT601, BT709, xvYcc) mit den meisten von denen, aber Sie müssen sie möglicherweise ändern, um die Kopien "richtig" zu bekommen (Sie müssen möglicherweise auch scot die Eingabe-oder Ausgabewerte, wenn Sie xvYcc oder nicht-8-Bit-Daten haben – tletnes

29

Sie könnten auch nur diese ganze Zahl versuchen wollen schreiben könnte Berechnungen (sollte schneller sein als Schwimmer)

#define CLIP(X) ((X) > 255 ? 255 : (X) < 0 ? 0 : X) 

// RGB -> YUV 
#define RGB2Y(R, G, B) CLIP((( 66 * (R) + 129 * (G) + 25 * (B) + 128) >> 8) + 16) 
#define RGB2U(R, G, B) CLIP(((-38 * (R) - 74 * (G) + 112 * (B) + 128) >> 8) + 128) 
#define RGB2V(R, G, B) CLIP(((112 * (R) - 94 * (G) - 18 * (B) + 128) >> 8) + 128) 

// YUV -> RGB 
#define C(Y) ((Y) - 16 ) 
#define D(U) ((U) - 128) 
#define E(V) ((V) - 128) 

#define YUV2R(Y, U, V) CLIP((298 * C(Y)    + 409 * E(V) + 128) >> 8) 
#define YUV2G(Y, U, V) CLIP((298 * C(Y) - 100 * D(U) - 208 * E(V) + 128) >> 8) 
#define YUV2B(Y, U, V) CLIP((298 * C(Y) + 516 * D(U)    + 128) >> 8) 

// RGB -> YCbCr 
#define CRGB2Y(R, G, B) CLIP((19595 * R + 38470 * G + 7471 * B) >> 16) 
#define CRGB2Cb(R, G, B) CLIP((36962 * (B - CLIP((19595 * R + 38470 * G + 7471 * B) >> 16)) >> 16) + 128) 
#define CRGB2Cr(R, G, B) CLIP((46727 * (R - CLIP((19595 * R + 38470 * G + 7471 * B) >> 16)) >> 16) + 128) 

// YCbCr -> RGB 
#define CYCbCr2R(Y, Cb, Cr) CLIP(Y + (91881 * Cr >> 16) - 179) 
#define CYCbCr2G(Y, Cb, Cr) CLIP(Y - ((22544 * Cb + 46793 * Cr) >> 16) + 135) 
#define CYCbCr2B(Y, Cb, Cr) CLIP(Y + (116129 * Cb >> 16) - 226) 
+3

Dies ist alles verrückt schwarze Magie zu mir :) – paulm

+0

Ist es nicht eine bessere Antwort, im Vergleich zu so genannten "ImageMagick"? – kenmux