From f0d2589db6b3e89e152f94e2066d2e539dc44eee Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Fri, 8 Apr 2005 19:45:17 +0000 Subject: Made the the RGB / YCrCb functions without floats and tested them (test passed) --- src/main.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index 0b0d84a..e49f249 100644 --- a/src/main.c +++ b/src/main.c @@ -25,38 +25,37 @@ unsigned char clip(int value) { /* RGB -> YCbCr (also from BMP to JPEG) */ // Y = 0.299 R + 0.587 G + 0.114 B unsigned char RGB2Y (unsigned char R, unsigned char G, unsigned char B) { - return clip(0.299 * R + 0.587 * G + 0.114 * B); + return clip(((R*77)>>8) + ((G*150)>>8) + ((B*29)>>8)); } // Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128 unsigned char RGB2Cb (unsigned char R, unsigned char G, unsigned char B) { - return clip(- 0.1687 * R - 0.3313 * G + 0.5 * B + 128); + return clip((B>>1)-((R*43)>>8) - ((G*85)>>8) + 128); } //Cr = 0.5 R - 0.4187 G - 0.0813 B + 128 unsigned char RGB2Cr (unsigned char R, unsigned char G, unsigned char B) { - return clip(0.5 * R - 0.4187 * G - 0.0813 * B + 128); + return clip((R>>1) - ((G*107)>>8) - ((B*21)>>8) + 128); } /* RGB -> YCbCr (also from JPEG to BMP) */ // R = Y + 1.402 (Cr-128) unsigned char YCbCr2R (unsigned char Y, unsigned char Cr) { - return clip(Y + 1.402 *(Cr-128)); + return clip(Y + (((Cr-128)*359)>>8)); } // G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128) unsigned char YCbCr2G (unsigned char Y, unsigned char Cb, unsigned char Cr) { - return clip(Y - 0.34414 *(Cb-128) - 0.71414 *(Cr-128)); + return clip(Y - (((Cb-128)*88)>>8) - (((Cr-128)*183)>>8)); } // B = Y + 1.772 (Cb-128) unsigned char YCbCr2B (unsigned char Y, unsigned char Cb) { - return clip(Y + 1.772 *(Cb-128)); + return clip(Y + (((Cb-128)*227)>>7)); } - int main(int argc, char *argv[]) { int retval, i; int workspace[DCTSIZE_BLOCK]; -- cgit v0.12