J'ai Y, CB, CR Valeurs de 8 bits, pouvez-vous me donner une fonction C simple qui le convertit à R, G, B chacun de 8 bits.
Voici un prototype de celui-ci. P >
void convertYCbCrToRGB( unsigned char Y, unsigned char cg, unsigned char cb, unsigned char &r, unsigned char &g, unsigned char &b);
4 Réponses :
Consultez ce page . Il contient des informations utiles sur les formules de conversion.
AS une mise de côté, vous pouvez retourner un INT non signé avec les valeurs de RGBA codées à partir de l'octet le plus important à l'octet moins significatif, c'est-à-dire P>
unsigned int YCbCrToRGBA(unsigned char Y, unsigned char Cb, unsigned char Cb) { unsigned char R = // conversion; unsigned char G = // conversion; unsigned char B = // conversion; return (R << 3) + (G << 2) + (B << 1) + 255; }
Je suis à la recherche d'une conversion correcte forumla uniquement. Parce que je le trouve différent partout. Même je suis aussi expert en C, C ++. :-)
Le site que je vous ai signalé est assez définitif, mais je sais où vous venez d'en ce qui concerne différentes perspectives sur la conversion des espaces de couleur.
Le problème vient que presque tout le monde confond ycbcr yuv et ypbpr. Donc, la littérature que vous pouvez trouver est souvent de merde. Tout d'abord, vous devez savoir si vous avez vraiment YCBCR ou si quelqu'un vous ment de vous: -). P>
YPBPR et YCBCR sont liés. Voici les bonnes formules: p>
https: //web.archive. Org / Web / 20180421030430 / http: //www.equasys.de/colorconversion.html P>
(l'archive.org a été ajouté pour fixer l'ancien lien brisé). P>
Lien très très serviable. Merci pour cela.
J'ai mis à jour le lien avec une version d'archive Internet @garyo
Voici ma solution à ma question.
Celui-ci est une gamme complète YCBCR à la routine de conversion RVB.
Color GetColorFromYCbCr(int y, int cb, int cr, int a) { double Y = (double) y; double Cb = (double) cb; double Cr = (double) cr; int r = (int) (Y + 1.40200 * (Cr - 0x80)); int g = (int) (Y - 0.34414 * (Cb - 0x80) - 0.71414 * (Cr - 0x80)); int b = (int) (Y + 1.77200 * (Cb - 0x80)); r = Max(0, Min(255, r)); g = Max(0, Min(255, g)); b = Max(0, Min(255, b)); return Color.FromArgb(a, r, g, b); }
Je pense que la conversion est automatique, elle n'est donc pas nécessaire explicitement. Belle solution.
Le fonctionnement entier de la norme ITU-R pour YCBCR est ( de Wikipedia ) ou de manière équivalente mais plus concise à: p> n'oubliez pas de pincer les valeurs de r, g et b dans [0,255]. P> p>
Je crois que la troisième ligne est incorrecte. Il devrait être lu: R = Y + (CR + CR >> 2 + CR >> 3 + CR >> 5);