2009-11-15 19 views
9

Comment effectuer une conversion RGB-> YUV en C/C++?Comment effectuer une conversion RGB-> YUV en C/C++?

J'ai quelques Bitmap .. RVB Je dois le convertir en YUV

Libs? Tuts? Des articles?

+4

's/avec actionscript/en C \/C++ /' ne fait pas une nouvelle question http://stackoverflow.com/questions/1737712/how-to-perform-rgb-yuv-conversion-with-actionscript – voyager

+1

Vous voulez changer une valeur RVB en YUV? Ou changer un bitmap RVB en un fichier YUV? Vous voulez faire une conversion de fichier image, non? – voyager

+0

Je suis sûr qu'il y a un moyen d'être un moyen de pousser ce travail sur la carte gfx. Ce type d'opération est parfait pour la carte gfx. – fishfood

Répondre

-3
+0

La question a demandé comment effectuer la conversion en C/C++. ImageMagick est C++, bien sûr, mais aucune fonction n'est illustrée ici (plus ImageMagick est sous sa propre licence), donc j'ai voté et mis à jour la réponse de Leszek. –

17

Vérifiez cet article: http://www.fourcc.org/fccyvrgb.php La conversion est assez facile pour que vous puissiez probablement écrire votre propre fonction basée sur cette

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

Salut Voyager j'ai besoin d'aide J'ai jeté mon code qui est yv12-> rgb565. De la même manière, je dois effectuer pour yuv444 à rgb888. Guidez-moi s'il-vous-plaît. S'il vous plaît vous pouvez regarder ma dernière question pour la fonction qui convertit yuv12-> rgb565 – Abhineet

+1

Notez qu'il existe plusieurs normes régissant l'espace de couleur que vous pourriez rencontrer dans un fichier yuv (BT601, BT709, xvYcc) ces formauls vous donnera une image viwable avec la plupart de ceux-ci, mais vous devrez peut-être les changer pour obtenir les coplors "corrects" (vous devrez peut-être couper les valeurs d'entrée ou de sortie si vous avez des données xvYcc ou non 8 bits – tletnes

29

Vous pouvez également essayer ces entier que les calculs (devrait être plus rapide que les flotteurs)

#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

pour moi :) – paulm

+0

N'est-ce pas une meilleure réponse, en comparaison avec ce qu'on appelle "ImageMagick"? – kenmux