From johnston@george.lbl.gov Wed Apr 10 23:25:51 1991 To: add@sciences.sdsu.edu, tiff@ucbvax.Berkeley.EDU Subject: Re: Kodak YCC image file format The file format is "icc", and there is nothing special about it. It is used for the 7700 high resolution printer, ans is basically just an rgb, byte/pixel file with a header. ------------------- /* *NAME * hipstoicc - convert hips file to icc (suitable for the kodak printer) *USAGE * hipstoicc out *DESCRIPTION * Converts a hips file to an icc file which is suitable for the * kodak XL7700 (true color and gray scale printer). * * Hipstoicc handles only one frame. * * The format for the output file is a monochrome ICC file, * padded to 8-pixel in the column or x direction. * * The format for the "ICC" header is: * * Magic Number (5965600) 4 bytes * Header Length 4 bytes * Extraneous data (Header Length -4) bytes * Image File header length 4 bytes * Header + data length 4 bytes * Logical File Name 16 bytes * File Type (7) 4 bytes * Extraneous data 8 bytes * Image X Size 4 bytes * Image Y Size 4 bytes * Extraneous data 12 bytes * Plane Count 4 bytes * Extraneous data 8 bytes * Extraneous data n bytes * RED DATA (X_SIZE * Y_SIZE bytes) * GREEN DATA (X_SIZE * Y_SIZE bytes) if needed * BLUE DATA (X_SIZE * Y_SIZE bytes) if needed * * * -Nancy Johnston, LBL - 24 Aug. 1990 */ #include "hipl_format.h" #include #include /* time defines */ #define STDOUT 1 /* input image declarations */ unsigned char *start_in_image_buf_byte, *in_image_byte; int in_image_size_bytes ; int num_rows, num_cols, num_frames, image_size; long int x_col_pad; char *out_line; long int header[128]; /* file header buffer */ long int clock; struct tm *date; int frame_num = 1; char *Progname; /*int out_fp;*/ main(argc,argv) int argc; char **argv; { struct header hd; int i, j; Progname = strsave(*argv); read_header(&hd); if(hd.pixel_format != PFBYTE) perr("pixel format must be bytes"); num_rows = hd.rows; num_cols = hd.cols; x_col_pad = (num_cols + 7) & 0xfffffff8L; /* allocated storage for one scan line */ out_line = (char *)calloc (x_col_pad, sizeof(char)); if (!out_line) { printf (" Could not allocated storage for scan line\n"); return (-1); } /* load outputted scanline with white */ for (i = 0; i < x_col_pad; ++i) out_line[i] = 255; /* compute size of the image being read in */ image_size = num_rows * num_cols; num_frames = hd.num_frame; /****** INITIALIZATION ******/ for (i = 0; i < 128; i++) header[i] = 0; clock = time((long *)0); date = localtime(&clock); header[0] = 5965600; /* magic number */ header[1] = 60; /* header length */ header[2] = 0; /* no H/W version */ header[3] = 0; /* no S/W version */ /* creation date */ header[4] = (((long)date->tm_year << 24) & 0xff000000L) + (((long)(date->tm_mon + 1) << 16) & 0x00ff0000L) + (((long)date->tm_mday << 8) & 0x0000ff00L) + ((long)date->tm_hour & 0x000000ffL); header[5] = (((long)date->tm_min << 24) & 0xff000000L) + (((long)date->tm_sec << 16) & 0x00ff0000L); header[6] = 0; /* no update date */ header[7] = 0; header[8] = 0x64656d6fL; /* user name ("demo") */ header[16] = 80; /* subfile header length */ header[17] = header[16] + (x_col_pad * num_rows); /* subfile length */ header[22] = 7; /* file type */ header[25] = num_cols; /* image x size */ header[26] = num_rows; /* image y size */ header[29] = 1; /* gray scale */ header[30] = 1; /* plane count */ write(STDOUT,header,144); /****** READ IN HIPS FILE ******/ start_in_image_buf_byte = (unsigned char*) halloc(image_size, sizeof (char)); in_image_byte = start_in_image_buf_byte; in_image_size_bytes = image_size * (sizeof(char)); if ((i = pread(0, start_in_image_buf_byte, in_image_size_bytes)) != in_image_size_bytes) perr("Unexpected end-of-file in frame number %d. %d bytes \ read for this frame.", frame_num, i); in_image_byte = start_in_image_buf_byte; /* set pointer to start of image */ /****** write out each row padding to 8 bits because thats what icc or kodak wants ******/ for (i=0; i < num_rows; ++i) { for (j = 0; j < num_cols; j++) out_line[j] = *in_image_byte++; write (STDOUT, out_line, x_col_pad); } }