/*---------------------------------------------------------------------------- File name : 3color.c Author : Nicolas Devillard Created on : Dec 13, 1997 Description : 3 color image combination ---------------------------------------------------------------------------*/ /* $Id: 3color.c,v 1.15 2002/01/29 12:35:52 ndevilla Exp $ $Author: ndevilla $ $Date: 2002/01/29 12:35:52 $ $Revision: 1.15 $ */ /*---------------------------------------------------------------------------- Includes ---------------------------------------------------------------------------*/ #include #include #include "eclipse.h" /* This function just gives the usage for the program */ static void usage(char *pname) ; static char prog_desc[] = "3 color combination" ; /*---------------------------------------------------------------------------- Main code ---------------------------------------------------------------------------*/ int main(int argc, char *argv[]) { char inn[3][FILENAMESZ+1], outname[FILENAMESZ+1] ; image_t * im[3] ; FILE * outppm ; int i,j ; int pos_in, pos_out ; pixelvalue minpix[3], maxpix[3] ; double A[3], B[3] ; unsigned char* buf ; if (argc<5) usage(argv[0]) ; /* Initialize eclipse environment */ eclipse_init(); /* Get arguments */ strncpy(inn[0], argv[1], FILENAMESZ) ; strncpy(inn[1], argv[2], FILENAMESZ) ; strncpy(inn[2], argv[3], FILENAMESZ) ; strncpy(outname, argv[4], FILENAMESZ) ; /* load all images */ for (i=0 ; i<3 ; i++) { im[i] = image_load(inn[i]) ; if (im[i]==NULL) { e_error("cannot load image [%s]", inn[i]); return -1 ; } } if ((im[0]->lx != im[1]->lx) || (im[0]->lx != im[2]->lx) || (im[0]->ly != im[1]->ly) || (im[0]->ly != im[2]->ly)) { e_error("input images have incompatible sizes\n" "red is [%d %d]\n" "green is [%d %d]\n" "blue is [%d %d]", im[0]->lx, im[0]->ly, im[1]->lx, im[1]->ly, im[2]->lx, im[2]->ly) ; image_del(im[0]) ; image_del(im[1]) ; image_del(im[2]) ; return -1 ; } printf("*** channels\n") ; printf("red : %s\n", inn[0]) ; printf("green : %s\n", inn[1]) ; printf("blue : %s\n", inn[2]) ; printf("\n") ; printf("24 bit PPM output : %s\n", outname) ; /* find minimum and maximum pixel values for the 3 images */ maxpix[0] = minpix[0] = im[0]->data[0] ; maxpix[1] = minpix[1] = im[1]->data[0] ; maxpix[2] = minpix[2] = im[2]->data[0] ; for (i=0 ; i<(im[0]->lx * im[0]->ly) ; i++) { for (j=0 ; j<3 ; j++) { if (im[j]->data[i] < minpix[j]) minpix[j] = im[j]->data[i] ; if (im[j]->data[i] > maxpix[j]) maxpix[j] = im[j]->data[i] ; } } for (i=0 ; i<3 ; i++) { A[i] = 255.0 / (maxpix[i] - minpix[i]) ; B[i] = - A[i] * minpix[i] ; } outppm = fopen(outname, "w") ; if (outppm == NULL) { e_error("cannot open file [%s] for output: aborting", outname); image_del(im[0]) ; image_del(im[1]) ; image_del(im[2]) ; } /* output an image in PPM P6 format */ /* header information */ fprintf(outppm, "P6\n") ; fprintf(outppm, "%d %d\n", im[0]->lx, im[0]->ly) ; fprintf(outppm, "255\n") ; /* allocate output buffer */ buf = (unsigned char *)malloc(3 * im[0]->lx * im[0]->ly) ; /* pixel values */ for (j=im[0]->ly-1 ; j>=0 ; j--) { for (i=0 ; ilx ; i++) { pos_in = i+j*im[0]->lx ; pos_out = i+(im[0]->ly-1-j)*im[0]->lx ; buf[3*pos_out]= (unsigned char)(0.5+A[0]*(double)im[0]->data[pos_in]+B[0]); buf[3*pos_out+1]= (unsigned char)(0.5+A[1]*(double)im[1]->data[pos_in]+B[1]); buf[3*pos_out+2]= (unsigned char)(0.5+A[2]*(double)im[2]->data[pos_in]+B[2]); } } fwrite(buf, 3 * im[0]->lx * im[0]->ly, 1, outppm) ; free(buf) ; fclose(outppm) ; image_del(im[0]) ; image_del(im[1]) ; image_del(im[2]) ; if (debug_active()) xmemory_status(); return 0 ; } /* * This function only gives the usage for the program */ static void usage(char *pname) { hello_world(pname, prog_desc) ; printf("\nuse: %s \n", pname) ; printf("\n") ; exit(0) ; }