/*********************************************************/ /* program 9: dither an image */ /*********************************************************/ #define DITH 2 #define XSIZE 640 #define YSIZE 480 unsigned char *ir,*ig,*ib; unsigned char *or,*og,*ob; main() { long int x,y,i,j,d,v; long int dith[DITH][DITH] = {0,3,2,1}; /* allocate input and output memory buffers */ ir = (unsigned char *) malloc (XSIZE*YSIZE); ig = (unsigned char *) malloc (XSIZE*YSIZE); ib = (unsigned char *) malloc (XSIZE*YSIZE); or = (unsigned char *) malloc (XSIZE*YSIZE); og = (unsigned char *) malloc (XSIZE*YSIZE); ob = (unsigned char *) malloc (XSIZE*YSIZE); /* read the input image */ read_image("input",ir,ig,ib); /* for each pixel, round according to dither matrix */ for (y = 0; y < YSIZE; y++) { j = y % DITH; for (x = 0; x < XSIZE; x++) { i = x % DITH; d = dith[i][j] << 4; v = ((long)ir[(y*XSIZE)+x] + d); if (v > 255) v = 255; or[(y*XSIZE)+x] = (unsigned char)((v >> 7) << 7); v = ((long)ig[(y*XSIZE)+x] + d); if (v > 255) v = 255; og[(y*XSIZE)+x] = (unsigned char)((v >> 7) << 7); v = ((long)ib[(y*XSIZE)+x] + d); if (v > 255) v = 255; ob[(y*XSIZE)+x] = (unsigned char)((v >> 7) << 7); } } /* write the output image */ write_image("output",or,og,ob); /* free memory buffers */ free(ir); free(ig); free(ib); free(or); free(og); free(ob); }