/* lbl2tga.c converts an '.lbl' file to a '.tga' file */ #include #include #include #define COLOR_MAP 1 #define TRUE_COLOR 2 #define B_W 3 #define NUM_IMAGE 2 #define NUM_TYPE 25 #define NUM_SIZE 25 #define MAX_LL 6 int Replicate=1,Top=0; unsigned char Buff1[16000],Buff4[16000][4],Buff3[16000][3]; int Scale[NUM_IMAGE][256]; int Range[NUM_IMAGE][3],Reverse[NUM_IMAGE]; char Channel[3][100],ChannelOn=0; long Sample_Rate=1; int Img=0,Sample=1,Xc=0,Yc=0,Speed=16,Row,Col,ZoomSample=1,ScreenZoom=-1; char ProjType; double X0,Y0,PixelSize; /* Albers elip */ int Vector=0; struct navigation { int numlat,numlon,numx,numy; double B_Lat[MAX_LL],B_Lon[MAX_LL]; double B_Y[MAX_LL],B_X[MAX_LL]; }Nav; struct line_name { char filename[54]; float max_pix,min_pix; int color; }MapFile[NUM_TYPE][NUM_SIZE]; int Ns[NUM_TYPE]; int Num_Active_Image=1; int P; char Group_Name[NUM_TYPE][30]; unsigned char TgaHdr[18]; struct Color { unsigned char r, g, b; }; struct image_header { int row,col; int sample; int record_bytes,file_records; int record_col_header; int row_col_header; long header_bytes; int imbedded_header; int sample_bits; int data_max,data_min; char infile[100],image[100],Lut[100],pal_type,label[100]; int vga_color[256]; struct Color lut[256],lutm[256],lutc[256]; }Hdr[2]; int set_header(int ID_length,int color_map,int compressed,int type, int cmap_start,int cmap_length,int cmap_bits, int x_orig,int y_orig,int col,int row, int pixel_depth,int start_top,int start_right); unsigned char Pal[256][3]; int Packed; main(argc,argv) int argc; char *argv[]; { int i,j,k,m; char string[100],name[50],cr=0xd; int color=0,type=3,cmap_length=0,r,g,b,colortype=0; FILE *fplut,*fpdat,*fptga; unsigned char val; int bits=32; long offset,limage,lrow,lcol,lhdr; if(argc<2) { printf("\n\nlbl2tga filename \n"); printf("\n"); printf(" options:\n"); printf(" /n -- where n = pixel bits -> 8, 24 or 32\n"); printf( " /r m -- where m = number of pixel replications (m x m)\n"); printf(" /top -- starts image at top\n"); printf(" /bottom -- starts image at bottom\n\n\n\n"); exit(0); } for(k=2;k10) { printf("Bad value for Replication (%d)\n",Replicate); exit(0); } printf("Replicating each pixel %d x %d times.\n", Replicate,Replicate); } if(strcmpi(argv[k],"/bottom")==0) Top=0; if(strcmpi(argv[k],"/top")==0) Top=1; } if(Top==0) printf("Image will start at bottom (use /top to reverse image)\n"); else printf("Image will start at top (use /bottom to reverse image)\n"); strcpy(name,argv[1]); sprintf(string,"%s.lbl",name); if(read_lbl(string,0)<1) { printf("Could not process '%s'\n\n",string); exit(0); } fplut=fopen(Hdr[0].Lut,"rt"); if(!fplut) { printf("Could not open Color Table File -- '%s'\n\n",Hdr[0].Lut); exit(0); } fpdat=fopen(Hdr[0].image,"rb"); if(!fpdat) { printf("Could not open Image -- '%s'\n\n",Hdr[0].image); exit(0); } if(strlen(Hdr[0].Lut)>3) { printf("Color Image -- Lut File = '%s'\n",Hdr[0].Lut); color=1; type=1; cmap_length=256; } printf("Image File = '%s'\n",Hdr[0].image); sprintf(string,"%s.tga",name); fptga=fopen(string,"wb"); if(!fptga) { printf("Could not open Targa output file -- '%s'\n\n",string); exit(0); } printf("Image Size = %d rows x %d columns\n",Hdr[0].row,Hdr[0].col); if(Hdr[0].header_bytes>0) printf("Image Header Bytes = %d\n\n",Hdr[0].header_bytes); lhdr=Hdr[0].header_bytes; lrow=Hdr[0].row; lcol=Hdr[0].col; limage=lrow*lcol; if(bits==8) { set_header(0,color,0,type,0,cmap_length,24,0,0, Hdr[0].col*Replicate,Hdr[0].row*Replicate, 8,Top,0); fwrite((char *)TgaHdr,sizeof(char),18,fptga); if(color==1) { for(i=0;i<256;i++) { fscanf(fplut,"%d%d%d%d",&j,&r,&g,&b); Pal[i][0]=b; Pal[i][1]=g; Pal[i][2]=r; } fwrite((char *)Pal,sizeof(char),256*3,fptga); fclose(fplut); } if(Top==0) fseek(fpdat,limage+lhdr-lcol,SEEK_SET); else fseek(fpdat,Hdr[0].header_bytes,SEEK_SET); for(i=0;i1) { for(j=Hdr[0].col-1;j>=0;j--) for(k=0;k0) fseek(fpdat,offset,SEEK_SET); if(Packed==0) { for(i=0;i30) { printf("Invalid SAMPLE_RATE = %ld\n",Sample_Rate); exit(0); } } if(strcmpi(string1,"Projection")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } ProjType=string3[0]; if(ProjType=='A') { while(fgetc(fp)!=0xa); /* skip to end of line */ fgets(string1,100,fp); sscanf(string1,"%lf",&lat0); fgets(string1,100,fp); sscanf(string1,"%lf",&lat1); fgets(string1,100,fp); sscanf(string1,"%lf",&lat2); fgets(string1,100,fp); sscanf(string1,"%lf",&lon0); fgets(string1,100,fp); sscanf(string1,"%lf",&X0); fgets(string1,100,fp); sscanf(string1,"%lf",&Y0); fgets(string1,100,fp); sscanf(string1,"%lf",&PixelSize); fgets(string1,100,fp); sscanf(string1,"%d",&P); /* set_const(P,lat0,lat1,lat2,lon0);*/ } } if(strcmpi(string1,"file_records")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%d",&Hdr[filenum].row); Hdr[filenum].file_records=Hdr[filenum].row; } if(strcmpi(string1,"line_samples")==0&&Hdr[filenum].record_bytes==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%d",&Hdr[filenum].col); } if(strcmpi(string1,"record_bytes")==0|| strcmpi(string1,"image_record_bytes")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%d",&Hdr[filenum].col); Hdr[filenum].record_bytes=Hdr[filenum].col; } if(strcmpi(string1,"header_bytes")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%ld",&Hdr[filenum].header_bytes); } if(strcmpi(string1,"data_max")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%d",&Hdr[filenum].data_max); } if(strcmpi(string1,"data_min")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } sscanf(string3,"%d",&Hdr[filenum].data_min); } if(strcmpi(string1,"image_pointer")==0) { numread=fscanf(fp,"%s%s",string2,string3); if(strcmpi(string2,"end")==0||strcmpi(string3,"end")==0|| numread<2) { fclose(fp); return(status); } k=0; for(i=0;iMAX_LL||Nav.numlat<2) { printf("Invalid number of Latitude coefficients '%s'\n\n",string3); exit(0); } for(i=0;iMAX_LL||Nav.numy<2) { printf("Invalid number of Y coefficients '%s'\n\n",string3); exit(0); } for(i=0;iMAX_LL||Nav.numlon<2) { printf("Invalid number of longitude coefficients '%s'\n\n",string3); exit(0); } for(i=0;iMAX_LL||Nav.numx<2) { printf("Invalid number of X coefficients '%s'\n\n",string3); exit(0); } for(i=0;i=NUM_IMAGE) { printf("Invalid number of images in set.\n\n"); exit(0); } for(i=0;i=NUM_TYPE) { printf("Invalid number of vector sets.\n"); exit(0); } for(i=0;i=NUM_SIZE) { printf("Invalid number of vectors.\n"); exit(0); } for(j=0;j