/*********************************************************/ /* program 4: RGB-to-YUV,YIQ conversion */ /* */ /* note: no main program is supplied for this example, */ /* only the routines to perform the conversions. */ /*********************************************************/ void rgb2yuv ( unsigned char r, unsigned char g, unsigned char b, long int *y, long int *u, long int * v ); void rgb2yiq(); void yuv2rgb(); void yiq2rgb(); /***********************************************/ /* rgb2yuv: RGB-to-YUV conversion */ /***********************************************/ void rgb2yuv ( unsigned char r, unsigned char g, unsigned char b, long int *y, long int *u, long int * v ) { *y = ((0x00004c8b * ((long)r & 0xff)) + (0x00009645 * ((long)g & 0xff)) + (0x00001d2f * ((long)b & 0xff))) >> 8; *u = ((0xffffda5f * ((long)r & 0xff)) + (0xffffb605 * ((long)g & 0xff)) + (0x00006f6f * ((long)b & 0xff))) >> 8; *v = ((0x00009d70 * ((long)r & 0xff)) + (0xffff7c29 * ((long)g & 0xff)) + (0xffffe667 * ((long)b & 0xff))) >> 8; return; } /***********************************************/ /* rgb2yiq: RGB-to-YIQ conversion */ /***********************************************/ void rgb2yiq(r,g,b,y,i,q) unsigned char r,g,b; long int *y,*i,*q; { *y = ((0x00004c8b * ((long)r & 0xff)) + (0x00009645 * ((long)g & 0xff)) + (0x00001d2f * ((long)b & 0xff))) >> 8; *i = ((0x00009893 * ((long)r & 0xff)) + (0xffffb9dc * ((long)g & 0xff)) + (0xffffad92 * ((long)b & 0xff))) >> 8; *q = ((0x00003604 * ((long)r & 0xff)) + (0xffff7a1d * ((long)g & 0xff)) + (0xffffb021 * ((long)b & 0xff))) >> 8; return; } /***********************************************/ /* yuv2rgb: YUV-to-RGB conversion */ /***********************************************/ void yuv2rgb(y,u,v,r,g,b) long int y,u,v; unsigned char *r,*g,*b; { *r = (unsigned char)((((0x00010000 * y) >> 24) & 0xff) + (((0x00000000 * u) >> 24) & 0xff) + (((0x0001672b * v) >> 24) & 0xff)); *g = (unsigned char)((((0x00010000 * y) >> 24) & 0xff) + (((0xffffa7f0 * u) >> 24) & 0xff) + (((0xffff4938 * v) >> 24) & 0xff)); *b = (unsigned char)((((0x00010000 * y) >> 24) & 0xff) + (((0x0001c5e3 * u) >> 24) & 0xff) + (((0x00000000 * v) >> 24) & 0xff)); return; } /***********************************************/ /* yiq2rgb: YIQ-to-RGB conversion */ /***********************************************/ void yiq2rgb(y,i,q,r,g,b) long int y,i,q; unsigned char *r,*g,*b; { *r = (unsigned char)((((0xfffedefa * y) >> 24) & 0xff) + (((0x00034e56 * i) >> 24) & 0xff) + (((0x00030000 * q) >> 24) & 0xff)); *g = (unsigned char)((((0x00019b64 * y) >> 24) & 0xff) + (((0xffff10e6 * i) >> 24) & 0xff) + (((0x000062d0 * q) >> 24) & 0xff)); *b = (unsigned char)((((0x0003753f * y) >> 24) & 0xff) + (((0xfffc2eda * i) >> 24) & 0xff) + (((0x0005e189 * q) >> 24) & 0xff)); return; }