/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M M OOO GGGG RRRR IIIII FFFFF Y Y % % MM MM O O G R R I F Y Y % % M M M O O G GG RRRRR I FFF Y % % M M O O G G R R I F Y % % M M OOO GGG R R IIIII F Y % % % % % % Transmogrify an Image or Sequence of Images. % % % % % % % % Software Design % % John Cristy % % December 1992 % % % % % % Copyright 1997 E. I. du Pont de Nemours and Company % % % % Permission to use, copy, modify, distribute, and sell this software and % % its documentation for any purpose is hereby granted without fee, % % provided that the above Copyright notice appear in all copies and that % % both that Copyright notice and this permission notice appear in % % supporting documentation, and that the name of E. I. du Pont de Nemours % % and Company not be used in advertising or publicity pertaining to % % distribution of the software without specific, written prior % % permission. E. I. du Pont de Nemours and Company makes no representations % % about the suitability of this software for any purpose. It is provided % % "as is" without express or implied warranty. % % % % E. I. du Pont de Nemours and Company disclaims all warranties with regard % % to this software, including all implied warranties of merchantability % % and fitness, in no event shall E. I. du Pont de Nemours and Company be % % liable for any special, indirect or consequential damages or any % % damages whatsoever resulting from loss of use, data or profits, whether % % in an action of contract, negligence or other tortuous action, arising % % out of or in connection with the use or performance of this software. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % `Mogrify' applies one or more image transforms to an image or sequence of % images and overwrites the original image. % % The Mogrify program command syntax is: % % Usage: mogrify [options ...] file [ [options ...] file ...] % % Where options include: % -blur factor apply a filter to blur the image % -border geometry surround image with a border of color % -box color color for annotation bounding box % -charcoal factor simulate a charcoal drawing % -colorize value colorize the image with the pen color % -colors value preferred number of colors in the image % -colorspace type GRAY, OHTA, RGB, XYZ, YCbCr, YIQ, YPbPr, or YUV % -comment string annotate image with comment % -compress type RunlengthEncoded or Zip % -contrast enhance or reduce the image contrast % -crop geometry preferred size and location of the cropped image % -cycle amount cycle the image colormap % -delay value display the next image after pausing % -density geometry vertical and horizontal density of the image % -despeckle reduce the speckles within an image", % -display server obtain image or font from this X server % -dispose method GIF disposal method % -dither apply Floyd/Steinberg error diffusion to image % -draw string annotate the image with a graphic primitive % -edge factor apply a filter to detect edges in the image % -emboss emboss an image % -enhance apply a digital filter to enhance a noisy image % -equalize perform histogram equalization to an image % -flip flip image in the vertical direction % -flop flop image in the horizontal direction % -font name X11 font for displaying text % -format type image format type % -frame geometry surround image with an ornamental border % -gamma value level of gamma correction % -geometry geometry perferred size or location of the image % -implode amount implode image pixels about the center % -interlace type None, Line, Plane, or Partition % -label name assign a label to an image % -linewidth value width of line in pixels % -loop iterations add Netscape loop extension to your GIF animation % -map filename transform image colors to match this set of colors % -modulate value vary the brightness, saturation, and hue % -monochrome transform image to black and white % -negate apply color inversion to image % -noise add or reduce noise in an image % -normalize transform image to span the full range of colors % -opaque color change this color to the pen color % -page geometry size and location of the Postscript page % -paint radius simulate an oil painting % -pen color color for annotating or changing opaque color % -pointsize value pointsize of Postscript font % -quality value JPEG quality setting % -raise value lighten/darken image edges to create a 3-D effect % -region geometry apply options to a portion of the image % -roll geometry roll an image vertically or horizontally % -rotate degrees apply Paeth rotation to the image % -sample geometry scale image with pixel sampling % -scene value image scene number % -segment values segment an image % -shade degrees shade the image using a distant light source % -sharpen factor apply a filter to sharpen the image % -shear geometry slide one edge of the image along the X or Y axis % -size geometry width and height of image % -solarize thresold negate all pixels above the threshold level % -spread amount displace image pixels by a random amount % -swirl degrees swirl image pixels about the center % -texture filename name of texture to tile onto the image background % -threshold value threshold the image % -transparent color make this color transparent within the image % -treedepth value depth of the color classification tree % -undercolor geometry control undercolor removal and black generation % -verbose print detailed information about the image % -wave geometry alter an image along a sine wave % % Change '-' to '+' in any option above to reverse its effect. For % example, specify +compress to store the image as uncompressed. % % By default, the image format of `file' is determined by its magic % number. To specify a particular image format, precede the filename % with an image format name and a colon (i.e. ps:image) or specify the % image type as the filename suffix (i.e. image.ps). Specify 'file' as % '-' for standard input or output. % % */ /* Include declarations. */ #include "magick.h" #include "version.h" /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % U s a g e % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Function Usage displays the program command syntax. % % The format of the Usage routine is: % % Usage(client_name) % % o client_name: a character string representing the name of the client % program. % % */ static void Usage(const char *client_name) { char **p; static char *options[]= { "-blur factor apply a filter to blur the image", "-border geometry surround image with a border of color", "-box color color for annotation bounding box", "-charcoal factor simulate a charcoal drawing", "-colorize value colorize the image with the pen color", "-colors value preferred number of colors in the image", "-colorspace type GRAY, OHTA, RGB, XYZ, YCbCr, YIQ, YPbPr, or YUV", "-comment string annotate image with comment", "-compress type RunlengthEncoded or Zip", "-contrast enhance or reduce the image contrast", "-crop geometry preferred size and location of the cropped image", "-cycle amount cycle the image colormap", "-delay value display the next image after pausing", "-density geometry vertical and horizontal density of the image", "-despeckle reduce the speckles within an image", "-display server obtain image or font from this X server", "-dispose method GIF disposal method", "-dither apply Floyd/Steinberg error diffusion to image", "-draw string annotate the image with a graphic primitive", "-edge factor apply a filter to detect edges in the image", "-emboss emboss an image", "-enhance apply a digital filter to enhance a noisy image", "-equalize perform histogram equalization to an image", "-flip flip image in the vertical direction", "-flop flop image in the horizontal direction", "-font name X11 font for displaying text", "-format type image format type", "-frame geometry surround image with an ornamental border", "-gamma value level of gamma correction", "-geometry geometry perferred size or location of the image", "-implode amount implode image pixels about the center", "-interlace type None, Line, Plane, or Partition", "-label name assign a label to an image", "-linewidth value width of line in pixels", "-loop iterations add Netscape loop extension to your GIF animation", "-map filename transform image colors to match this set of colors", "-modulate value vary the brightness, saturation, and hue", "-monochrome transform image to black and white", "-negate apply color inversion to image", "-noise add or reduce noise in an image.", "-normalize transform image to span the full range of colors", "-opaque color change this color to the pen color", "-page geometry size and location of the Postscript page", "-paint radius simulate an oil painting", "-pen color color for annotating or changing opaque color", "-pointsize value pointsize of Postscript font", "-quality value JPEG quality setting", "-raise value lighten/darken image edges to create a 3-D effect", "-region geometry apply options to a portion of the image", "-roll geometry roll an image vertically or horizontally", "-rotate degrees apply Paeth rotation to the image", "-sample geometry scale image with pixel sampling", "-scene number image scene number", "-segment values segment an image", "-shade degrees shade the image using a distant light source", "-sharpen factor apply a filter to sharpen the image", "-shear geometry slide one edge of the image along the X or Y axis", "-size geometry width and height of image", "-solarize thresold negate all pixels above the threshold level", "-spread amount displace image pixels by a random amount", "-swirl degrees swirl image pixels about the center", "-texture filename name of texture to tile onto the image background", "-threshold value threshold the image", "-transparent color make this color transparent within the image", "-treedepth value depth of the color classification tree", "-undercolor geometry control undercolor removal and black generation", "-verbose print detailed information about the image", "-wave geometry alter an image along a sine wave", (char *) NULL }; (void) printf("Version: %s\n\n",Version); (void) printf( "Usage: %s [-options ...] file [ [-options ...] file ...]\n",client_name); (void) printf("\nWhere options include: \n"); for (p=options; *p != (char *) NULL; p++) (void) printf(" %s\n",*p); (void) printf( "\nChange '-' to '+' in any option above to reverse its effect. For\n"); (void) printf( "example, specify +compress to store the image as uncompressed.\n"); (void) printf( "\nBy default, the image format of `file' is determined by its magic\n"); (void) printf( "number. To specify a particular image format, precede the filename\n"); (void) printf( "with an image format name and a colon (i.e. ps:image) or specify the\n"); (void) printf( "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n"); (void) printf("'-' for standard input or output.\n"); Exit(1); } /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % % % % % M a i n % % % % % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % */ int main(int argc,char **argv) { char *client_name, filename[MaxTextExtent], *format, *option; ImageInfo image_info; Image *image; int x; register int i; unsigned int global_colormap, scene, status; /* Display usage profile if there are no command line arguments. */ ReadCommandlLine(argc,&argv); client_name=ClientName(*argv); if (argc < 2) Usage(client_name); /* Set defaults. */ format=(char *) NULL; global_colormap=False; image=(Image *) NULL; GetImageInfo(&image_info); scene=0; /* Parse command line. */ ExpandFilenames(&argc,&argv); for (i=1; i < argc; i++) { option=argv[i]; if ((Extent(option) > 1) && ((*option == '-') || (*option == '+'))) switch (*(option+1)) { case 'b': { if (strncmp("blur",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing factor on -blur",(char *) NULL); } break; } if (strncmp("border",option+1,7) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -border",(char *) NULL); } break; } if (strncmp("bordercolor",option+1,7) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing color on -bordercolor",(char *) NULL); } break; } if (strncmp("box",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing color on -box",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'c': { if (strncmp("charcoal",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing factor on -charcoal",(char *) NULL); } break; } if (strncmp("colorize",option+1,7) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing value on -colorsize",(char *) NULL); } break; } if (strncmp("colors",option+1,7) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing colors on -colors",(char *) NULL); } break; } if (strncmp("colorspace",option+1,7) == 0) { if (*option == '-') { ColorspaceType colorspace; i++; if (i == argc) Error("Missing type on -colorspace",(char *) NULL); option=argv[i]; colorspace=UndefinedColorspace; if (Latin1Compare("gray",option) == 0) colorspace=GRAYColorspace; if (Latin1Compare("ohta",option) == 0) colorspace=OHTAColorspace; if (Latin1Compare("rgb",option) == 0) colorspace=RGBColorspace; if (Latin1Compare("transparent",option) == 0) colorspace=TransparentColorspace; if (Latin1Compare("xyz",option) == 0) colorspace=XYZColorspace; if (Latin1Compare("ycbcr",option) == 0) colorspace=YCbCrColorspace; if (Latin1Compare("yiq",option) == 0) colorspace=YIQColorspace; if (Latin1Compare("ypbpr",option) == 0) colorspace=YPbPrColorspace; if (Latin1Compare("yuv",option) == 0) colorspace=YUVColorspace; if (colorspace == UndefinedColorspace) Error("Invalid colorspace type on -colorspace",option); } break; } if (strncmp("comment",option+1,4) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing comment on -comment",(char *) NULL); } break; } if (strncmp("compress",option+1,3) == 0) { image_info.compression=NoCompression; if (*option == '-') { i++; if (i == argc) Error("Missing type on -compress",(char *) NULL); option=argv[i]; if (Latin1Compare("runlengthencoded",option) == 0) image_info.compression=RunlengthEncodedCompression; else if (Latin1Compare("zip",option) == 0) image_info.compression=ZipCompression; else Error("Invalid compression type on -compress",option); } break; } if (strncmp("contrast",option+1,3) == 0) break; if (strncmp("crop",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -crop",(char *) NULL); } break; } if (strncmp("cycle",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing amount on -cycle",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'd': { if (strncmp("delay",option+1,3) == 0) { image_info.delay=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing delay on -delay",(char *) NULL); image_info.delay=PostscriptGeometry(argv[i]); } break; } if (strncmp("density",option+1,3) == 0) { image_info.density=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -density",(char *) NULL); image_info.density=argv[i]; } break; } if (strncmp("despeckle",option+1,3) == 0) break; if (strcmp("display",option+1) == 0) { image_info.server_name=(char *) NULL; if (*option == '-') { i++; if (i == argc) Error("Missing server name on -display",(char *) NULL); image_info.server_name=argv[i]; } break; } if (strncmp("dispose",option+1,5) == 0) { image_info.dispose=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing method on -dispose",(char *) NULL); image_info.dispose=PostscriptGeometry(argv[i]); } break; } if (strncmp("dither",option+1,3) == 0) { image_info.dither=(*option == '-'); break; } if (strncmp("draw",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing primitive on -draw",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'e': { if (strncmp("edge",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing factor on -edge",(char *) NULL); } break; } if (strncmp("emboss",option+1,2) == 0) break; if (strncmp("enhance",option+1,2) == 0) break; if (strncmp("equalize",option+1,2) == 0) break; Error("Unrecognized option",option); break; } case 'f': { if (strncmp("flip",option+1,3) == 0) break; if (strncmp("flop",option+1,3) == 0) break; if (strncmp("font",option+1,3) == 0) { image_info.font=(char *) NULL; if (*option == '-') { i++; if (i == argc) Error("Missing font name on -font",(char *) NULL); image_info.font=argv[i]; } break; } if (strncmp("format",option+1,3) == 0) { format=(char *) NULL; if (*option == '-') { i++; if (i == argc) Error("Missing image type on -format",(char *) NULL); format=argv[i]; (void) strcpy(image_info.filename,format); (void) strcat(image_info.filename,":"); SetImageInfo(&image_info,False); if (*image_info.magick == '\0') Error("Unrecognized image format",format); } break; } if (strncmp("frame",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -frame",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'g': { if (strncmp("gamma",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing value on -gamma",(char *) NULL); } break; } if (strncmp("geometry",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -geometry",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'h': { if (strncmp("help",option+1,2) == 0) { Usage(client_name); break; } Error("Unrecognized option",option); break; } case 'i': { if (strncmp("implode",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing amount on -implode",(char *) NULL); } break; } if (strncmp("interlace",option+1,3) == 0) { image_info.interlace=NoneInterlace; if (*option == '-') { i++; if (i == argc) Error("Missing type on -interlace",(char *) NULL); option=argv[i]; image_info.interlace=UndefinedInterlace; if (Latin1Compare("none",option) == 0) image_info.interlace=NoneInterlace; if (Latin1Compare("line",option) == 0) image_info.interlace=LineInterlace; if (Latin1Compare("plane",option) == 0) image_info.interlace=PlaneInterlace; if (Latin1Compare("partition",option) == 0) image_info.interlace=PartitionInterlace; if (image_info.interlace == UndefinedInterlace) Error("Invalid interlace type on -interlace",option); } break; } Error("Unrecognized option",option); break; } case 'l': { if (strncmp("label",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing label name on -label",(char *) NULL); } break; } if (strncmp("linewidth",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing size on -linewidth",(char *) NULL); } break; } if (strncmp("loop",option+1,2) == 0) { image_info.iterations=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing iterations on -loop",(char *) NULL); image_info.iterations=PostscriptGeometry(argv[i]); } break; } Error("Unrecognized option",option); break; } case 'm': { if (strncmp("map",option+1,3) == 0) { global_colormap=(*option == '+'); if (*option == '-') { i++; if (i == argc) Error("Missing file name on -map",(char *) NULL); } break; } if (strncmp("mattecolor",option+1,6) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing color on -mattecolor",(char *) NULL); } break; } if (strncmp("modulate",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing value on -modulate",(char *) NULL); } break; } if (strncmp("monochrome",option+1,4) == 0) { image_info.monochrome=(*option == '-'); break; } Error("Unrecognized option",option); break; } case 'n': { if (strncmp("negate",option+1,3) == 0) break; if (strncmp("noise",option+1,3) == 0) { if (*option == '+') { i++; if (i == argc) Error("Missing type on +noise",(char *) NULL); option=argv[i]; if ((Latin1Compare("uniform",option) != 0) && (Latin1Compare("gaussian",option) != 0) && (Latin1Compare("multiplicative",option) != 0) && (Latin1Compare("impulse",option) != 0) && (Latin1Compare("laplacian",option) != 0) && (Latin1Compare("poisson",option) != 0)) Error("Invalid noise type on +noise",option); } break; } if (strncmp("normalize",option+1,3) == 0) break; Error("Unrecognized option",option); break; } case 'o': { if (strncmp("opaque",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing color on -opaque",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'p': { if (strncmp("page",option+1,3) == 0) { image_info.page=(char *) NULL; if (*option == '-') { i++; if (i == argc) Error("Missing page geometry on -page",(char *) NULL); image_info.page=PostscriptGeometry(argv[i]); } break; } if (strncmp("paint",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing radius on -paint",(char *) NULL); } break; } if (strncmp("pen",option+1,2) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing pen color on -pen",(char *) NULL); } break; } if (strncmp("pointsize",option+1,2) == 0) { image_info.pointsize=atoi(DefaultPointSize); if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing size on -pointsize",(char *) NULL); image_info.pointsize=atoi(argv[i]); } break; } Error("Unrecognized option",option); break; } case 'q': { if (strncmp("quality",option+1,2) == 0) { image_info.quality=atoi(DefaultImageQuality); if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing quality on -quality",(char *) NULL); image_info.quality=atoi(argv[i]); } break; } Error("Unrecognized option",option); break; } case 'r': { if (strncmp("raise",option+1,2) == 0) { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing bevel width on -raise",(char *) NULL); break; } if (strncmp("region",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -region",(char *) NULL); } break; } if (strncmp("roll",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -roll",(char *) NULL); } break; } if (strncmp("rotate",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing degrees on -rotate",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 's': { if (strncmp("sample",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -sample",(char *) NULL); } break; } if (strncmp("scene",option+1,3) == 0) { scene=0; if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing scene number on -scene",(char *) NULL); scene=atoi(argv[i]); } break; } if (strncmp("segment",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing threshold on -segment",(char *) NULL); } break; } if (strncmp("shade",option+1,5) == 0) { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing azimuth on -shade",(char *) NULL); break; } if (strncmp("sharpen",option+1,5) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing factor on -sharpen",(char *) NULL); } break; } if (strncmp("shear",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing shear geometry on -shear",(char *) NULL); } break; } if (strncmp("size",option+1,2) == 0) { image_info.size=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !IsGeometry(argv[i])) Error("Missing geometry on -size",(char *) NULL); image_info.size=argv[i]; } break; } if (strncmp("solarize",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing threshold on -solarize",(char *) NULL); } break; } if (strncmp("spread",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing amount on -spread",(char *) NULL); } break; } if (strncmp("swirl",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing degrees on -swirl",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 't': { if (strncmp("texture",option+1,5) == 0) { image_info.texture=(char *) NULL; if (*option == '-') { i++; if (i == argc) Error("Missing filename on -texture",(char *) NULL); image_info.texture=argv[i]; } break; } if (strncmp("threshold",option+1,2) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing value on -threshold",(char *) NULL); } break; } if (strncmp("transparent",option+1,3) == 0) { if (*option == '-') { i++; if (i == argc) Error("Missing color on -transparent",(char *) NULL); } break; } if (strncmp("treedepth",option+1,3) == 0) { if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing depth on -treedepth",(char *) NULL); } break; } Error("Unrecognized option",option); break; } case 'u': { if (strncmp("undercolor",option+1,2) == 0) { image_info.undercolor=(char *) NULL; if (*option == '-') { i++; if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x)) Error("Missing undercolor geometry on -undercolor", (char *) NULL); image_info.undercolor=argv[i]; } break; } Error("Unrecognized option",option); break; } case 'v': { image_info.verbose=(*option == '-'); break; } case 'w': { if (strcmp("wave",option+1) == 0) { i++; if ((i == argc) || !sscanf(argv[i],"%d",&x)) Error("Missing amplitude on -wave",(char *) NULL); break; } Error("Unrecognized option",option); break; } case '?': { Usage(client_name); break; } default: { Error("Unrecognized option",option); break; } } else { /* Option is a file name: begin by reading image from specified file. */ (void) strcpy(image_info.filename,argv[i]); image=ReadImage(&image_info); if (image == (Image *) NULL) if (*option == '-') break; else continue; if (scene != 0) image->scene=scene; if (format != (char *) NULL) { register char *p; /* Modify filename to include a user specified image format. */ p=image->filename+Extent(image->filename)-1; while ((*p != '.') && (p > image->filename)) p--; p++; if (strcmp(p,image->magick) == 0) (void) strcpy(p,format); else { (void) sprintf(image_info.filename,"%s:%s",format, image->filename); (void) strcpy(image->filename,image_info.filename); } } /* Transmogrify image as defined by the image processing options. */ MogrifyImages(&image_info,i,argv,&image); if (global_colormap) MapImages(image,(Image *) NULL,image_info.dither); /* Write transmogified image to disk. */ if (format != (char *) NULL) { AppendImageFormat(format,image->filename); (void) WriteImage(&image_info,image); DestroyImage(image); continue; } (void) strcpy(filename,image->filename); LocaleFilename(image->filename); status=WriteImage(&image_info,image); if (status == True) { (void) remove(filename); (void) rename(image->filename,filename); } DestroyImage(image); } } if (image == (Image *) NULL) Error("Missing an image file name",(char *) NULL); Exit(0); return(False); }