Main Page   Data Structures   File List   Data Fields   Globals  

img2epsf.c

Go to the documentation of this file.
00001 #include        "sadie.h"
00002 /*#include        <sys/time.h>*/
00003 #include        <stdio.h>
00004 
00005 /*-Copyright Information------------------------------------------------------*/
00006 /* Copyright (c) 1994 by the University of Arizona Digital Image Analysis Lab */
00007 /*----------------------------------------------------------------------------*/
00008 /*-General Information--------------------------------------------------------*/
00009 /*                                                                            */
00010 /*   This function writes an EPSF image to disk.                              */
00011 /*                                                                            */
00012 /*----------------------------------------------------------------------------*/
00013 /*-Interface Information------------------------------------------------------*/
00014 void IMG2EPSF (
00015 IMAGE *in,           /*  I   Pointer to the image.                            */
00016 char *name,          /*  I   String, containing the name of the disk file.    */
00017 short nbit           /*  I   Bits/pixel in disk file.                         */
00018 /*----------------------------------------------------------------------------*/
00019 ) { static char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
00020     unsigned char *ptr=NULL, *data=NULL, cval;
00021     char msg[SLEN];
00022     short  i, j, k, error;
00023     long nbytes;
00024     double factor, dval;
00025     time_t secs;
00026     struct tm *t;
00027     FILE *fp=NULL;
00028    
00029     if (TIMES) TIMING(T_IMG2EPSF);
00030     if (NAMES) {
00031         MESSAGE('I',"");
00032         MESSAGE('I',"IMG2EPSF");
00033         MESSAGE('I',"");
00034         sprintf(msg," Input image:               %s",in->text);
00035         MESSAGE('I',msg);
00036         sprintf(msg," Output disk file:          %s",name);
00037         MESSAGE('I',msg);
00038         sprintf(msg," Output format:             %d-bit EPSF",nbit);
00039         MESSAGE('I',msg);
00040         MESSAGE('I'," ...............");
00041     }
00042 
00043     /* check input */
00044     if (!CHECKIMG(in)) {
00045         MESSAGE('E'," Can't identify image.");
00046         goto the_end;
00047     }
00048 
00049     /* open image file */
00050     if (!(fp=fopen(name,"w"))) {
00051         sprintf(msg," Can't open file %s.",name);
00052         MESSAGE('E',msg);
00053         goto the_end;
00054     }
00055 
00056     nbytes = max((long)4096,(long)2*(long)in->npix+(long)1);
00057     if ((ptr=data=(unsigned char *)malloc(nbytes*sizeof(unsigned char))) == NULL) {
00058                 MESSAGE('E'," Memory request failed.");
00059                 goto the_end;
00060     }
00061     secs = time(NULL);
00062     t = localtime(&secs);
00063 
00064     /* write image header to file */
00065     sprintf((char *)ptr            ,"%%!PS-Adobe-3.0 EPSF-3.0\r");
00066     sprintf((char *)ptr+strlen((char *)ptr),"%%%%Creator: SADIE\r");
00067     sprintf((char *)ptr+strlen((char *)ptr),"%%%%Title: %s\r",name);
00068     sprintf((char *)ptr+strlen((char *)ptr),"%%%%CreationDate: %02d/%02d/%02d %02d:%02d\r",t->tm_mon,t->tm_mday,t->tm_year,t->tm_hour,t->tm_min);
00069     sprintf((char *)ptr+strlen((char *)ptr),"%%%%BoundingBox: 0 0 %d %d\r",in->npix,in->nlin);
00070     sprintf((char *)ptr+strlen((char *)ptr),"%%%%SuppressDotGainCompensation\r");
00071     if (in->nbnd != 3) {
00072         sprintf((char *)ptr+strlen((char *)ptr),"%%%%DocumentProcessColors: Black\r");
00073     }
00074     sprintf((char *)ptr+strlen((char *)ptr),"%%%%EndComments\r");
00075     sprintf((char *)ptr+strlen((char *)ptr),"%%%%BeginProlog\r");
00076     sprintf((char *)ptr+strlen((char *)ptr),"%%%%EndProlog\r");
00077     sprintf((char *)ptr+strlen((char *)ptr),"%%%%BeginSetup\r");
00078     sprintf((char *)ptr+strlen((char *)ptr),"%%%%EndSetup\r");
00079     sprintf((char *)ptr+strlen((char *)ptr),"%%ImageData: %d %d %d %d %d %d %d \"beginimage\"\r",in->npix,in->nlin,nbit,in->nbnd,in->nbnd==3,in->npix,1);
00080     if (in->nbnd != 3) {
00081         sprintf((char *)ptr+strlen((char *)ptr),"gsave\r");
00082         sprintf((char *)ptr+strlen((char *)ptr),"40 dict begin\r");
00083         sprintf((char *)ptr+strlen((char *)ptr),"/_image systemdict /image get def\r");
00084         sprintf((char *)ptr+strlen((char *)ptr),"/_setgray systemdict /setgray get def\r");
00085         sprintf((char *)ptr+strlen((char *)ptr),"/_currentgray systemdict /currentgray get def\r");
00086         sprintf((char *)ptr+strlen((char *)ptr),"/_settransfer systemdict /settransfer get def\r");
00087         sprintf((char *)ptr+strlen((char *)ptr),"/_currenttransfer systemdict /currenttransfer get def\r");
00088         sprintf((char *)ptr+strlen((char *)ptr),"/blank 0 _currenttransfer exec\r");
00089         sprintf((char *)ptr+strlen((char *)ptr),"1 _currenttransfer exec eq def\r");
00090         sprintf((char *)ptr+strlen((char *)ptr),"/negative blank\r");
00091         sprintf((char *)ptr+strlen((char *)ptr),"{0 _currenttransfer exec 0.5 lt}\r");
00092         sprintf((char *)ptr+strlen((char *)ptr),"{0 _currenttransfer exec 1 _currenttransfer exec gt}\r");
00093         sprintf((char *)ptr+strlen((char *)ptr),"ifelse def\r");
00094         sprintf((char *)ptr+strlen((char *)ptr),"/inverted? negative def\r");
00095         sprintf((char *)ptr+strlen((char *)ptr),"/level2 systemdict /languagelevel known\r");
00096         sprintf((char *)ptr+strlen((char *)ptr),"{languagelevel 2 ge} {false} ifelse def\r");
00097         sprintf((char *)ptr+strlen((char *)ptr),"gsave\r");
00098         sprintf((char *)ptr+strlen((char *)ptr),"/rows %d def\r",in->nlin);
00099         sprintf((char *)ptr+strlen((char *)ptr),"/cols %d def\r",in->npix);
00100         sprintf((char *)ptr+strlen((char *)ptr),"72 %ld mul %ld div dup cols mul exch rows mul scale\r",(long)in->nlin*(long)in->npix,(long)72*(long)in->nlin*(long)in->npix);
00101         sprintf((char *)ptr+strlen((char *)ptr),"level2 {\r");
00102         sprintf((char *)ptr+strlen((char *)ptr),"/DeviceGray\r");
00103         sprintf((char *)ptr+strlen((char *)ptr),"setcolorspace} if\r");
00104         sprintf((char *)ptr+strlen((char *)ptr),"/picstr1 %d string def\r",in->npix);
00105         sprintf((char *)ptr+strlen((char *)ptr),"/readdata {currentfile exch readhexstring pop} def\r");
00106         sprintf((char *)ptr+strlen((char *)ptr),"/image2 level2 {/image load def} {{begin\r");
00107         sprintf((char *)ptr+strlen((char *)ptr),"Width Height BitsPerComponent ImageMatrix\r");
00108         sprintf((char *)ptr+strlen((char *)ptr),"/DataSource load image end} def} ifelse\r");
00109         sprintf((char *)ptr+strlen((char *)ptr),"/beginimage {\r");
00110         sprintf((char *)ptr+strlen((char *)ptr),"image2\r");
00111         sprintf((char *)ptr+strlen((char *)ptr),"} def\r");
00112         sprintf((char *)ptr+strlen((char *)ptr),"12 dict begin\r");
00113         sprintf((char *)ptr+strlen((char *)ptr),"/ImageType 1 def\r");
00114         sprintf((char *)ptr+strlen((char *)ptr),"/Width cols def\r");
00115         sprintf((char *)ptr+strlen((char *)ptr),"/Height rows def\r");
00116         sprintf((char *)ptr+strlen((char *)ptr),"/ImageMatrix [cols 0 0 rows neg 0 rows] def\r");
00117         sprintf((char *)ptr+strlen((char *)ptr),"/BitsPerComponent %d def\r",nbit);
00118         sprintf((char *)ptr+strlen((char *)ptr),"/Decode [0 1] def\r");
00119         sprintf((char *)ptr+strlen((char *)ptr),"/DataSource {picstr1 readdata} def\r");
00120         sprintf((char *)ptr+strlen((char *)ptr),"currentdict end\r");
00121         sprintf((char *)ptr+strlen((char *)ptr),"%%%%BeginData: %ld ASCII Lines\r",(long)in->nlin+(long)1);
00122         sprintf((char *)ptr+strlen((char *)ptr),"beginimage\r");
00123     } else {
00124         sprintf((char *)ptr+strlen((char *)ptr),"gsave\r");
00125         sprintf((char *)ptr+strlen((char *)ptr),"/hascolor /statusdict where {pop\r");
00126         sprintf((char *)ptr+strlen((char *)ptr),"statusdict /processcolors known\r");
00127         sprintf((char *)ptr+strlen((char *)ptr),"{statusdict /processcolors get exec 1 gt}\r");
00128         sprintf((char *)ptr+strlen((char *)ptr),"{false} ifelse} {false} ifelse def\r");
00129         sprintf((char *)ptr+strlen((char *)ptr),"40 dict begin\r");
00130         sprintf((char *)ptr+strlen((char *)ptr),"/_image systemdict /image get def\r");
00131         sprintf((char *)ptr+strlen((char *)ptr),"/_setgray systemdict /setgray get def\r");
00132         sprintf((char *)ptr+strlen((char *)ptr),"/_currentgray systemdict /currentgray get def\r");
00133         sprintf((char *)ptr+strlen((char *)ptr),"/_settransfer systemdict /settransfer get def\r");
00134         sprintf((char *)ptr+strlen((char *)ptr),"/_currenttransfer systemdict /currenttransfer get def\r");
00135         sprintf((char *)ptr+strlen((char *)ptr),"/blank 0 _currenttransfer exec\r");
00136         sprintf((char *)ptr+strlen((char *)ptr),"1 _currenttransfer exec eq def\r");
00137         sprintf((char *)ptr+strlen((char *)ptr),"/negative blank\r");
00138         sprintf((char *)ptr+strlen((char *)ptr),"{0 _currenttransfer exec 0.5 lt}\r");
00139         sprintf((char *)ptr+strlen((char *)ptr),"{0 _currenttransfer exec 1 _currenttransfer exec gt}\r");
00140         sprintf((char *)ptr+strlen((char *)ptr),"ifelse def\r");
00141         sprintf((char *)ptr+strlen((char *)ptr),"/inverted? negative def\r");
00142         sprintf((char *)ptr+strlen((char *)ptr),"/level2 systemdict /languagelevel known\r");
00143         sprintf((char *)ptr+strlen((char *)ptr),"{languagelevel 2 ge} {false} ifelse def\r");
00144         sprintf((char *)ptr+strlen((char *)ptr),"/foureq {4 index eq 8 1 roll\r");
00145         sprintf((char *)ptr+strlen((char *)ptr),"4 index eq 8 1 roll\r");
00146         sprintf((char *)ptr+strlen((char *)ptr),"4 index eq 8 1 roll\r");
00147         sprintf((char *)ptr+strlen((char *)ptr),"4 index eq 8 1 roll\r");
00148         sprintf((char *)ptr+strlen((char *)ptr),"pop pop pop pop and and and} def\r");
00149         sprintf((char *)ptr+strlen((char *)ptr),"hascolor {/band 0 def} {/band 5 def} ifelse\r");
00150         sprintf((char *)ptr+strlen((char *)ptr),"/setcmykcolor where {pop\r");
00151         sprintf((char *)ptr+strlen((char *)ptr),"1 0 0 0 setcmykcolor _currentgray 1 exch sub\r");
00152         sprintf((char *)ptr+strlen((char *)ptr),"0 1 0 0 setcmykcolor _currentgray 1 exch sub\r");
00153         sprintf((char *)ptr+strlen((char *)ptr),"0 0 1 0 setcmykcolor _currentgray 1 exch sub\r");
00154         sprintf((char *)ptr+strlen((char *)ptr),"0 0 0 1 setcmykcolor _currentgray 1 exch sub\r");
00155         sprintf((char *)ptr+strlen((char *)ptr),"4 {4 copy} repeat\r");
00156         sprintf((char *)ptr+strlen((char *)ptr),"1 0 0 0 foureq {/band 1 store} if\r");
00157         sprintf((char *)ptr+strlen((char *)ptr),"0 1 0 0 foureq {/band 2 store} if\r");
00158         sprintf((char *)ptr+strlen((char *)ptr),"0 0 1 0 foureq {/band 3 store} if\r");
00159         sprintf((char *)ptr+strlen((char *)ptr),"0 0 0 1 foureq {/band 4 store} if\r");
00160         sprintf((char *)ptr+strlen((char *)ptr),"0 0 0 0 foureq {/band 6 store} if} if\r");
00161         sprintf((char *)ptr+strlen((char *)ptr),"blank {/band 6 store} if\r");
00162         sprintf((char *)ptr+strlen((char *)ptr),"gsave\r");
00163         sprintf((char *)ptr+strlen((char *)ptr),"/rows %d def\r",in->nlin);
00164         sprintf((char *)ptr+strlen((char *)ptr),"/cols %d def\r",in->npix);
00165         sprintf((char *)ptr+strlen((char *)ptr),"72 %ld mul %ld div dup cols mul exch rows mul scale\r",(long)in->nlin*(long)in->npix,(long)72*(long)in->nlin*(long)in->npix);
00166         sprintf((char *)ptr+strlen((char *)ptr),"level2 {\r");
00167         sprintf((char *)ptr+strlen((char *)ptr),"band 0 eq {\r");
00168         sprintf((char *)ptr+strlen((char *)ptr),"[/CIEBasedABC 3 dict begin\r");
00169         sprintf((char *)ptr+strlen((char *)ptr),"/DecodeLMN [{1.8 exp} bind dup dup] def\r");
00170         sprintf((char *)ptr+strlen((char *)ptr),"/MatrixLMN [\r");
00171         sprintf((char *)ptr+strlen((char *)ptr),"0.4497 0.2446 0.0252\r");
00172         sprintf((char *)ptr+strlen((char *)ptr),"0.3163 0.6720 0.1412\r");
00173         sprintf((char *)ptr+strlen((char *)ptr),"0.1845 0.0833 0.9227\r");
00174         sprintf((char *)ptr+strlen((char *)ptr),"] def\r");
00175         sprintf((char *)ptr+strlen((char *)ptr),"/WhitePoint [0.9505 1 1.0891] def\r");
00176         sprintf((char *)ptr+strlen((char *)ptr),"currentdict end]\r");
00177         sprintf((char *)ptr+strlen((char *)ptr),"} {/DeviceGray} ifelse\r");
00178         sprintf((char *)ptr+strlen((char *)ptr),"setcolorspace} if\r");
00179         sprintf((char *)ptr+strlen((char *)ptr),"/picstr1 %d string def\r",in->npix);
00180         sprintf((char *)ptr+strlen((char *)ptr),"/picstr2 %d string def\r",in->npix);
00181         sprintf((char *)ptr+strlen((char *)ptr),"/picstr3 %d string def\r",in->npix);
00182         sprintf((char *)ptr+strlen((char *)ptr),"/picstr4 %d string def\r",in->npix);
00183         sprintf((char *)ptr+strlen((char *)ptr),"/readdata {currentfile exch readhexstring pop} def\r");
00184         sprintf((char *)ptr+strlen((char *)ptr),"/image2 level2 {/image load def} {{begin\r");
00185         sprintf((char *)ptr+strlen((char *)ptr),"Width Height BitsPerComponent ImageMatrix\r");
00186         sprintf((char *)ptr+strlen((char *)ptr),"Decode length 2 eq\r");
00187         sprintf((char *)ptr+strlen((char *)ptr),"{/DataSource load image} if\r");
00188         sprintf((char *)ptr+strlen((char *)ptr),"Decode length 6 eq\r");
00189         sprintf((char *)ptr+strlen((char *)ptr),"{DataSource 0 get DataSource 1 get DataSource 2 get\r");
00190         sprintf((char *)ptr+strlen((char *)ptr),"true 3 colorimage} if\r");
00191         sprintf((char *)ptr+strlen((char *)ptr),"Decode length 8 eq\r");
00192         sprintf((char *)ptr+strlen((char *)ptr),"{DataSource 0 get DataSource 1 get\r");
00193         sprintf((char *)ptr+strlen((char *)ptr),"DataSource 2 get DataSource 3 get\r");
00194         sprintf((char *)ptr+strlen((char *)ptr),"true 4 colorimage} if\r");
00195         sprintf((char *)ptr+strlen((char *)ptr),"end} def} ifelse\r");
00196         sprintf((char *)ptr+strlen((char *)ptr),"/_image2 level2 {/_image load def} {{begin\r");
00197         sprintf((char *)ptr+strlen((char *)ptr),"Width Height BitsPerComponent ImageMatrix\r");
00198         sprintf((char *)ptr+strlen((char *)ptr),"/DataSource load _image end} def} ifelse\r");
00199         sprintf((char *)ptr+strlen((char *)ptr),"/beginimage {\r");
00200         sprintf((char *)ptr+strlen((char *)ptr),"band 0 eq band 4 eq or band 5 eq or\r");
00201         sprintf((char *)ptr+strlen((char *)ptr),"{image2}\r");
00202         sprintf((char *)ptr+strlen((char *)ptr),"{negative {{pop 0}} {{pop 1}} ifelse\r");
00203         sprintf((char *)ptr+strlen((char *)ptr),"_settransfer _image2} ifelse\r");
00204         sprintf((char *)ptr+strlen((char *)ptr),"} def\r");
00205         sprintf((char *)ptr+strlen((char *)ptr),"12 dict begin\r");
00206         sprintf((char *)ptr+strlen((char *)ptr),"/ImageType 1 def\r");
00207         sprintf((char *)ptr+strlen((char *)ptr),"/Width cols def\r");
00208         sprintf((char *)ptr+strlen((char *)ptr),"/Height rows def\r");
00209         sprintf((char *)ptr+strlen((char *)ptr),"/ImageMatrix [cols 0 0 rows neg 0 rows] def\r");
00210         sprintf((char *)ptr+strlen((char *)ptr),"/BitsPerComponent %d def\r",nbit);
00211         sprintf((char *)ptr+strlen((char *)ptr),"band 0 eq\r");
00212         sprintf((char *)ptr+strlen((char *)ptr),"{/Decode [0 1 0 1 0 1] def\r");
00213         sprintf((char *)ptr+strlen((char *)ptr),"/MultipleDataSources true def\r");
00214         sprintf((char *)ptr+strlen((char *)ptr),"/DataSource [\r");
00215         sprintf((char *)ptr+strlen((char *)ptr),"{picstr1 readdata}\r");
00216         sprintf((char *)ptr+strlen((char *)ptr),"{picstr2 readdata}\r");
00217         sprintf((char *)ptr+strlen((char *)ptr),"{picstr3 readdata picstr4 readdata pop}\r");
00218         sprintf((char *)ptr+strlen((char *)ptr),"] def}\r");
00219         sprintf((char *)ptr+strlen((char *)ptr),"{/Decode [0 1] def\r");
00220         sprintf((char *)ptr+strlen((char *)ptr),"/DataSource {\r");
00221         sprintf((char *)ptr+strlen((char *)ptr),"picstr1 readdata pop\r");
00222         sprintf((char *)ptr+strlen((char *)ptr),"picstr2 readdata pop\r");
00223         sprintf((char *)ptr+strlen((char *)ptr),"picstr3 readdata pop\r");
00224         sprintf((char *)ptr+strlen((char *)ptr),"picstr4 readdata\r");
00225         sprintf((char *)ptr+strlen((char *)ptr),"} def}\r");
00226         sprintf((char *)ptr+strlen((char *)ptr),"ifelse\r");
00227         sprintf((char *)ptr+strlen((char *)ptr),"currentdict end\r");
00228         sprintf((char *)ptr+strlen((char *)ptr),"%%%%BeginData: %ld ASCII Lines\r",(long)4*(long)in->nlin+(long)1);
00229         sprintf((char *)ptr+strlen((char *)ptr),"beginimage\r");
00230     }
00231     nbytes = (long)strlen((char *)ptr);
00232     if (fwrite(ptr,nbytes,1,fp) != 1) {
00233         sprintf(msg," Can't write image header to file %s.",name);
00234         MESSAGE('E',msg);
00235         goto the_end;
00236     }
00237 
00238     /* write image data to file */
00239     factor = 255.0 / (in->gmax-in->gmin);
00240     nbytes = (long)2*(long)in->npix + (long)1;
00241     ptr[(long)2*(long)in->npix] = '\r';
00242     if (in->nbnd != 3) {
00243         for (j=0; j<in->nlin; j+=1) {
00244             for (ptr=data, k=0; k<in->npix; k+=1, ptr+=2) {
00245                 dval   = (in->data[0][j][k]-in->gmin)*factor;
00246                 cval   = (unsigned char)dval;
00247                 ptr[0] = hex[(cval & 0xF0)  >>  4];
00248                 ptr[1] = hex[(cval & 0x0F)];
00249             }
00250             if (fwrite(data,nbytes,1,fp) != 1) {
00251                 sprintf(msg," Can't write image data to file %s.",name);
00252                 MESSAGE('E',msg);
00253                 goto the_end;
00254             }
00255         }
00256     } else {
00257         for (j=0; j<in->nlin; j+=1) {
00258             for (i=0; i<in->nbnd; i+=1) {
00259                 for (ptr=data, k=0; k<in->npix; k+=1, ptr+=2) {
00260                     dval   = (in->data[i][j][k]-in->gmin)*factor;
00261                     cval   = (unsigned char)dval;
00262                     ptr[0] = hex[(cval & 0xF0)  >>  4];
00263                     ptr[1] = hex[(cval & 0x0F)];
00264                 }
00265                 if (fwrite(data,nbytes,1,fp) != 1) {
00266                     sprintf(msg," Can't write image data to file %s.",name);
00267                     MESSAGE('E',msg);
00268                     goto the_end;
00269                 }
00270             }
00271             for (ptr=data, k=0; k<in->npix; k+=1, ptr+=2) {
00272                 dval   = (in->data[0][j][k]-in->gmin)*factor*0.30 + (in->data[1][j][k]-in->gmin)*factor*0.59 + (in->data[2][j][k]-in->gmin)*factor*0.11;
00273                 cval   = (unsigned char)rnd(dval);
00274                 ptr[0] = hex[(cval & 0xF0)  >>  4];
00275                 ptr[1] = hex[(cval & 0x0F)];
00276             }
00277             if (fwrite(data,nbytes,1,fp) != 1) {
00278                 sprintf(msg," Can't write image data to file %s.",name);
00279                 MESSAGE('E',msg);
00280                 goto the_end;
00281             }
00282         }
00283     }
00284 
00285     /* write image trailer to file */
00286     sprintf((char *)ptr            ,"%%%%EndData\r");
00287     sprintf((char *)ptr+strlen((char *)ptr),"grestore end\r");
00288     sprintf((char *)ptr+strlen((char *)ptr),"grestore\r");
00289     nbytes = (long)strlen((char *)ptr);
00290     if (fwrite(ptr,nbytes,1,fp) != 1) {
00291         sprintf(msg," Can't write image trailer to file %s.",name);
00292         MESSAGE('E',msg);
00293         goto the_end;
00294     }
00295 
00296     /* close image file */
00297     the_end:
00298     if (fp) {
00299         if (fclose(fp)) {
00300             sprintf(msg," Can't close file %s.",name);
00301             MESSAGE('W',msg);
00302         }
00303     }
00304 
00305     if (data) free(data);
00306 
00307     if (TIMES) TIMING(T_EXIT);
00308 }

Generated on Wed Apr 9 08:56:07 2003 for TREES by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002