home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-07-13 | 50.3 KB | 1,331 lines |
- Newsgroups: comp.sources.x
- From: cristy@eplrx7.es.duPont.com (Cristy)
- Subject: v20i088: imagemagic - X11 image processing and display, Part32/38
- Message-ID: <1993Jul14.232204.23200@sparky.sterling.com>
- X-Md4-Signature: f35ef75b7a90aaa02d6f003481089e02
- Sender: chris@sparky.sterling.com (Chris Olson)
- Organization: Sterling Software
- Date: Wed, 14 Jul 1993 23:22:04 GMT
- Approved: chris@sterling.com
-
- Submitted-by: cristy@eplrx7.es.duPont.com (Cristy)
- Posting-number: Volume 20, Issue 88
- Archive-name: imagemagic/part32
- Environment: X11
- Supersedes: imagemagic: Volume 13, Issue 17-37
-
- #!/bin/sh
- # this is magick.32 (part 32 of ImageMagick)
- # do not concatenate these parts, unpack them in order with /bin/sh
- # file ImageMagick/montage.c continued
- #
- if test ! -r _shar_seq_.tmp; then
- echo 'Please unpack part 1 first!'
- exit 1
- fi
- (read Scheck
- if test "$Scheck" != 32; then
- echo Please unpack part "$Scheck" next!
- exit 1
- else
- exit 0
- fi
- ) < _shar_seq_.tmp || exit 1
- if test ! -f _shar_wnt_.tmp; then
- echo 'x - still skipping ImageMagick/montage.c'
- else
- echo 'x - continuing file ImageMagick/montage.c'
- sed 's/^X//' << 'SHAR_EOF' >> 'ImageMagick/montage.c' &&
- X resource_info.number_colors=atoi(argv[i]);
- X }
- X break;
- X }
- X if (strncmp("colorspace",option+1,7) == 0)
- X {
- X resource_info.colorspace=RGBColorspace;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing type on -colorspace",(char *) NULL);
- X option=argv[i];
- X resource_info.colorspace=UndefinedColorspace;
- X if (Latin1Compare("gray",option) == 0)
- X resource_info.colorspace=GRAYColorspace;
- X if (Latin1Compare("rgb",option) == 0)
- X resource_info.colorspace=RGBColorspace;
- X if (Latin1Compare("xyz",option) == 0)
- X resource_info.colorspace=XYZColorspace;
- X if (Latin1Compare("ycbcr",option) == 0)
- X resource_info.colorspace=YCbCrColorspace;
- X if (Latin1Compare("yiq",option) == 0)
- X resource_info.colorspace=YIQColorspace;
- X if (Latin1Compare("yuv",option) == 0)
- X resource_info.colorspace=YUVColorspace;
- X if (resource_info.colorspace == UndefinedColorspace)
- X Error("invalid colorspace type on -colorspace",option);
- X }
- X break;
- X }
- X if (strncmp("compress",option+1,5) == 0)
- X {
- X compression=NoCompression;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing type on -compress",(char *) NULL);
- X option=argv[i];
- X if (Latin1Compare("runlengthencoded",option) == 0)
- X compression=RunlengthEncodedCompression;
- X else
- X if (Latin1Compare("qencoded",option) == 0)
- X compression=QEncodedCompression;
- X else
- X Error("invalid compression type on -compress",option);
- X }
- X break;
- X }
- X if (strncmp("compose",option+1,5) == 0)
- X {
- X compose=ReplaceCompositeOp;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing type on -compose",(char *) NULL);
- X option=argv[i];
- X compose=UndefinedCompositeOp;
- X if (Latin1Compare("over",option) == 0)
- X compose=OverCompositeOp;
- X if (Latin1Compare("in",option) == 0)
- X compose=InCompositeOp;
- X if (Latin1Compare("out",option) == 0)
- X compose=OutCompositeOp;
- X if (Latin1Compare("atop",option) == 0)
- X compose=AtopCompositeOp;
- X if (Latin1Compare("xor",option) == 0)
- X compose=XorCompositeOp;
- X if (Latin1Compare("plus",option) == 0)
- X compose=PlusCompositeOp;
- X if (Latin1Compare("minus",option) == 0)
- X compose=MinusCompositeOp;
- X if (Latin1Compare("add",option) == 0)
- X compose=AddCompositeOp;
- X if (Latin1Compare("subtract",option) == 0)
- X compose=SubtractCompositeOp;
- X if (Latin1Compare("difference",option) == 0)
- X compose=DifferenceCompositeOp;
- X if (Latin1Compare("replace",option) == 0)
- X compose=ReplaceCompositeOp;
- X if (compose == UndefinedCompositeOp)
- X Error("invalid compose type on -compose",option);
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'd':
- X {
- X if (strncmp("density",option+1,3) == 0)
- X {
- X density=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing geometry on -density",(char *) NULL);
- X density=argv[i];
- X }
- X break;
- X }
- X if (strncmp("display",option+1,3) == 0)
- X {
- X resource_info.server_name=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing server name on -display",(char *) NULL);
- X resource_info.server_name=argv[i];
- X }
- X break;
- X }
- X if (strncmp("dither",option+1,3) == 0)
- X {
- X resource_info.dither=(*option == '-');
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'f':
- X {
- X if (strncmp("font",option+1,3) == 0)
- X {
- X resource_info.font=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing font name on -font",(char *) NULL);
- X resource_info.font=argv[i];
- X }
- X break;
- X }
- X if (strncmp("foreground",option+1,3) == 0)
- X {
- X resource_info.foreground_color=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing foreground on -foreground",(char *) NULL);
- X resource_info.foreground_color=argv[i];
- X }
- X break;
- X }
- X if (strncmp("frame",option+1,2) == 0)
- X {
- X frame=(*option == '-');
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'g':
- X {
- X if (strncmp("gamma",option+1,2) == 0)
- X {
- X gamma=0.0;
- X if (*option == '-')
- X {
- X i++;
- X if ((i == argc) || !sscanf(argv[i],"%f",(float *) &x))
- X Error("missing gamma on -gamma",(char *) NULL);
- X gamma=atof(argv[i]);
- X }
- X break;
- X }
- X if (strncmp("geometry",option+1,2) == 0)
- X {
- X resource_info.image_geometry=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing geometry on -geometry",(char *) NULL);
- X resource_info.image_geometry=argv[i];
- X }
- X break;
- X }
- X if (strncmp("gravity",option+1,2) == 0)
- X {
- X resource_info.gravity=CenterGravity;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing type on -gravity",(char *) NULL);
- X option=argv[i];
- X resource_info.gravity=(-1);
- X if (Latin1Compare("Forget",option) == 0)
- X resource_info.gravity=ForgetGravity;
- X if (Latin1Compare("NorthWest",option) == 0)
- X resource_info.gravity=NorthWestGravity;
- X if (Latin1Compare("North",option) == 0)
- X resource_info.gravity=NorthGravity;
- X if (Latin1Compare("NorthEast",option) == 0)
- X resource_info.gravity=NorthEastGravity;
- X if (Latin1Compare("West",option) == 0)
- X resource_info.gravity=WestGravity;
- X if (Latin1Compare("Center",option) == 0)
- X resource_info.gravity=CenterGravity;
- X if (Latin1Compare("East",option) == 0)
- X resource_info.gravity=EastGravity;
- X if (Latin1Compare("SouthWest",option) == 0)
- X resource_info.gravity=SouthWestGravity;
- X if (Latin1Compare("South",option) == 0)
- X resource_info.gravity=SouthGravity;
- X if (Latin1Compare("SouthEast",option) == 0)
- X resource_info.gravity=SouthEastGravity;
- X if (Latin1Compare("Static",option) == 0)
- X resource_info.gravity=StaticGravity;
- X if (resource_info.gravity == (-1))
- X Error("invalid gravity type on -gravity",option);
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'h':
- X {
- X if (strncmp("help",option+1,2) == 0)
- X {
- X Usage();
- X break;
- X }
- X if (strncmp("highlight",option+1,2) == 0)
- X {
- X resource_info.highlight_color=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing color on -highlight",(char *) NULL);
- X resource_info.highlight_color=argv[i];
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'i':
- X {
- X if (strncmp("interlace",option+1,3) == 0)
- X {
- X interlace=NoneInterlace;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing type on -interlace",(char *) NULL);
- X option=argv[i];
- X interlace=UndefinedInterlace;
- X if (Latin1Compare("none",option) == 0)
- X interlace=NoneInterlace;
- X if (Latin1Compare("line",option) == 0)
- X interlace=LineInterlace;
- X if (Latin1Compare("plane",option) == 0)
- X interlace=PlaneInterlace;
- X if (interlace == UndefinedInterlace)
- X Error("invalid interlace type on -interlace",option);
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'm':
- X {
- X resource_info.monochrome=(*option == '-');
- X break;
- X }
- X case 'p':
- X {
- X if (strncmp("page",option+1,2) == 0)
- X {
- X page_geometry=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing page geometry on -page",(char *) NULL);
- X page_geometry=argv[i];
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'q':
- X {
- X i++;
- X if ((i == argc) || !sscanf(argv[i],"%d",&x))
- X Error("missing quality on -quality",(char *) NULL);
- X quality=atoi(argv[i]);
- X break;
- X }
- X case 'r':
- X {
- X degrees=0;
- X if (*option == '-')
- X {
- X i++;
- X if ((i == argc) || !sscanf(argv[i],"%d",&x))
- X Error("missing degrees on -rotate",(char *) NULL);
- X degrees=atoi(argv[i]);
- X }
- X break;
- X }
- X case 't':
- X {
- X if (strncmp("tiles_per_row",option+1,3) == 0)
- X {
- X tiles_per_row=0;
- X if (*option == '-')
- X {
- X i++;
- X if ((i == argc) || !sscanf(argv[i],"%d",&x))
- X Error("missing value on -tiles_per_row",(char *) NULL);
- X tiles_per_row=atoi(argv[i]);
- X }
- X break;
- X }
- X if (strncmp("title",option+1,3) == 0)
- X {
- X resource_info.title=(char *) NULL;
- X if (*option == '-')
- X {
- X i++;
- X if (i == argc)
- X Error("missing title on -title",(char *) NULL);
- X resource_info.title=argv[i];
- X }
- X break;
- X }
- X if (strncmp("treedepth",option+1,2) == 0)
- X {
- X resource_info.tree_depth=0;
- X if (*option == '-')
- X {
- X i++;
- X if ((i == argc) || !sscanf(argv[i],"%d",&x))
- X Error("missing depth on -treedepth",(char *) NULL);
- X resource_info.tree_depth=atoi(argv[i]);
- X }
- X break;
- X }
- X Error("unrecognized option",option);
- X break;
- X }
- X case 'v':
- X {
- X verbose=(*option == '-');
- X break;
- X }
- X default:
- X {
- X Error("unrecognized option",option);
- X break;
- X }
- X }
- X else
- X {
- X char
- X geometry[2048];
- X
- X Image
- X *image,
- X info_image;
- X
- X RectangleInfo
- X tile_info;
- X
- X unsigned int
- X scale_factor;
- X
- X /*
- X Option is a file name: begin by reading image from specified file.
- X */
- X start_time=time((time_t *) NULL);
- X GetImageInfo(&image_info);
- X (void) strcpy(image_info.filename,option);
- X image_info.server_name=resource_info.server_name;
- X image_info.font=resource_info.font;
- X image_info.geometry=resource_info.image_geometry;
- X image_info.page=page_geometry;
- X image_info.density=density;
- X image_info.border_color=resource_info.border_color;
- X image_info.interlace=interlace;
- X image_info.monochrome=resource_info.monochrome;
- X image_info.quality=quality;
- X image_info.verbose=verbose;
- X image=ReadImage(&image_info);
- X if (image == (Image *) NULL)
- X if (*option == '-')
- X break;
- X else
- X continue;
- X do
- X {
- X if (image->scene == 0)
- X image->scene=image_number;
- X info_image=(*image);
- X /*
- X Allocate and initialize image label.
- X */
- X image->label=(char *)
- X malloc(((strlen(image->filename)+2048)*sizeof(char)));
- X if (image->label == (char *) NULL)
- X Error("unable to montage images","memory allocation failed");
- X (void) sprintf(image->label,"%s %ux%u",image->filename,
- X image->columns,image->rows);
- X /*
- X Tile size maintains the aspect ratio of the image.
- X */
- X tile_info.width=256;
- X tile_info.height=256;
- X if (resource_info.image_geometry != (char *) NULL)
- X {
- X XParseGeometry(resource_info.image_geometry,
- X &tile_info.x,&tile_info.y,&tile_info.width,&tile_info.height);
- X if ((tile_info.width == 0) || (tile_info.height == 0))
- X Error("invalid image geometry",resource_info.image_geometry);
- X }
- X if (aspect_ratio)
- X {
- X /*
- X Respect aspect ratio of the image.
- X */
- X scale_factor=UpShift(tile_info.width)/image->columns;
- X if (scale_factor > (UpShift(tile_info.height)/image->rows))
- X scale_factor=UpShift(tile_info.height)/image->rows;
- X tile_info.width=DownShift(image->columns*scale_factor);
- X tile_info.height=DownShift(image->rows*scale_factor);
- X }
- X (void) sprintf(geometry,"%ux%u",tile_info.width,tile_info.height);
- X TransformImage(&image,clip_geometry,geometry,(char *) NULL);
- X if ((degrees % 360) != 0)
- X {
- X Image
- X *rotated_image;
- X
- X /*
- X Rotate image.
- X */
- X rotated_image=RotateImage(image,(double) degrees,False);
- X if (rotated_image != (Image *) NULL)
- X {
- X DestroyImage(image);
- X image=rotated_image;
- X }
- X }
- X if (gamma > 0.0)
- X GammaImage(image,gamma);
- X if (verbose)
- X {
- X /*
- X Display detailed info about the image.
- X */
- X (void) fprintf(stderr,"[%u] %s",
- X image->scene == 0 ? image_number : image->scene,
- X image->filename);
- X (void) fprintf(stderr," %ux%u",info_image.columns,
- X info_image.rows);
- X if ((info_image.columns != image->columns) ||
- X (info_image.rows != image->rows))
- X (void) fprintf(stderr,"=>%ux%u",image->columns,image->rows);
- X if (image->class == DirectClass)
- X (void) fprintf(stderr," DirectClass");
- X else
- X (void) fprintf(stderr," PseudoClass %uc",image->colors);
- X (void) fprintf(stderr," %s\n",image->magick);
- X }
- X /*
- X Pack image data to conserve memory (memory <=> speed).
- X */
- X (void) RunlengthEncodeImage(image);
- X (void) free((char *) image->pixels);
- X image->pixels=(RunlengthPacket *) NULL;
- X if (image_number == maximum_images)
- X {
- X /*
- X Increase size of images array.
- X */
- X maximum_images<<=1;
- X images=(Image **)
- X realloc((char *) images,maximum_images*sizeof(Image *));
- X if (images == (Image **) NULL)
- X Error("unable to montage images","memory allocation failed");
- X }
- X images[image_number++]=image;
- X image=image->next;
- X } while (image != (Image *) NULL);
- X }
- X }
- X if (image_number == 0)
- X Error("missing an image file name",(char *) NULL);
- X /*
- X Create composite image.
- X */
- X montage_image=MontageImage(display,&resource_info,images,image_number,
- X tiles_per_row,frame,compose);
- X if (resource_info.colorspace == GRAYColorspace)
- X QuantizeImage(montage_image,256,8,resource_info.dither,GRAYColorspace,True);
- X if (resource_info.monochrome)
- X QuantizeImage(montage_image,2,8,resource_info.dither,GRAYColorspace,True);
- X if (resource_info.number_colors != 0)
- X {
- X QuantizeImage(montage_image,resource_info.number_colors,
- X resource_info.tree_depth,resource_info.dither,resource_info.colorspace,
- X True);
- X SyncImage(montage_image);
- X }
- X if (compression != UndefinedCompression)
- X montage_image->compression=compression;
- X (void) strcpy(montage_image->filename,write_filename);
- X (void) WriteImage(&image_info,montage_image);
- X if (verbose)
- X {
- X /*
- X Display detailed info about the image.
- X */
- X if (montage_image->class == DirectClass)
- X montage_image->colors=NumberColors(montage_image,False);
- X (void) fprintf(stderr,"[%u] %s %ux%u",montage_image->scene,
- X montage_image->filename,montage_image->columns,montage_image->rows);
- X if (montage_image->class == DirectClass)
- X (void) fprintf(stderr," DirectClass ");
- X else
- X (void) fprintf(stderr," PseudoClass ");
- X (void) fprintf(stderr,"%uc %s %lds\n",montage_image->colors,
- X montage_image->magick,time((time_t *) NULL)-start_time+1);
- X }
- X DestroyImage(montage_image);
- X (void) free((char *) images);
- X if (display != (Display *) NULL)
- X XCloseDisplay(display);
- X return(False);
- }
- SHAR_EOF
- echo 'File ImageMagick/montage.c is complete' &&
- chmod 0644 ImageMagick/montage.c ||
- echo 'restore of ImageMagick/montage.c failed'
- Wc_c="`wc -c < 'ImageMagick/montage.c'`"
- test 56463 -eq "$Wc_c" ||
- echo 'ImageMagick/montage.c: original size 56463, current size' "$Wc_c"
- rm -f _shar_wnt_.tmp
- fi
- # ============= ImageMagick/montage.man ==============
- if test -f 'ImageMagick/montage.man' -a X"$1" != X"-c"; then
- echo 'x - skipping ImageMagick/montage.man (File already exists)'
- rm -f _shar_wnt_.tmp
- else
- > _shar_wnt_.tmp
- echo 'x - extracting ImageMagick/montage.man (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/montage.man' &&
- .ad l
- .nh
- .TH montage 1 "10 October 1992" "ImageMagick"
- .SH NAME
- montage - creates a composite image by combining several separate images
- .SH SYNOPSIS
- .B "montage" [ \fIoptions\fP ...] \fIfile\fP
- [ [ \fIoptions\fP ...] \fIfile\fP ...] \fIoutput_file\fP
- .SH DESCRIPTION
- \fBmontage\fP creates a composite image by combining several separate images.
- The images are tiled on the composite image with the name of the image
- optionally appearing just below the individual tile.
- X
- The composite image is constructed in the following manner. First,
- each image specified on the command line, except for the last, is
- scaled to fit the maximum tile size. The maximum tile size by default
- is 256x256. It can be modified with the \fB-geometry\fP command line
- argument or X resource. See \fBOPTIONS\fP for more information on
- command line arguments. See \fBX(1)\fP for more information on X
- resources. Note that the maximum tile size need not be a square. The
- original aspect ratio of each image is maintainted unless
- \fB\+aspect_ratio\fP is specified.
- X
- Next the composite image is initialized with the color specified by the
- \fP-background\fP command line argument or X resource. The width and
- height of the composite image is determined by the title specified,
- the maximum tile size, the number of tiles per row, the tile border
- width and height, the image border width, and the label height. The
- number of tiles per row specifies how many images are to appear in each
- row of the composite image. The default is to have an equal number of
- images in each row and column of the composite. A specific value is
- specified with \fB-tiles_per_row\fP. The tile border width and height,
- and the image border width defaults to the value of the X resource
- \fB-borderwidth\fP. It can be changed with the \fB-borderwidth\fP or
- \fB-geometry\fP command line argument or X resource. The label height
- is determined by the font you specify with the \fB-font\fP command line
- argument or X resource. If you do not specify a font, a font is
- choosen that allows the name of the image to fit the maximum width of a
- tiled area. The label colors is determined by the \fB-background\fP
- and \fB-foreground\fP command line argument or X resource. Note, that
- if the background and foreground colors are the same, labels will not
- appear.
- X
- Initially, the composite image title is placed at the top if one is
- specified (refer to \fB-foreground\fP X resource). Next, each image is
- set onto the composite image, surrounded by its border color, with its
- name centered just below it. The individual images are left-justified
- within the width of the tiled area. The order of the images is the
- same as they appear on the command line unless the images have a scene
- keyword. If a scene number is specified in each image, then the images
- are tiled onto the composite in the order of their scene number. Finally,
- the last argument on the command line is the name assigned to the
- composite image. By default, the image is written in the \fBMIFF\fP format
- and can be viewed or printed with \fBdisplay(1)\fP.
- .SH EXAMPLES
- To create a montage of a cockatoo, a parrot, and a hummingbird and write
- it to a file called birds, use:
- .PP
- .B
- X montage cockatoo.miff parrot.miff hummingbird.miff birds.miff
- .PP
- To tile several bird images so that they are at most 256 pixels in width and
- 192 pixels in height, surrounded by a red border, and separated by
- 10 pixels of background color, use:
- .PP
- .B
- X montage -geometry 256x192+10+10 -bordercolor red birds.* montage.miff
- .PP
- To create an unlabeled parrot image, 640 by 480 pixels, and surrounded
- by a border of black, use:
- .PP
- .B
- X montage +display -geometry 640x480 -bordercolor black parrot.miff bird.miff
- .SH OPTIONS
- .TP 5
- .B "-aspect_ratio
- The original aspect ratio of each image is adhered to unless
- \fB\+aspect_ratio\fP is specfified.
- X
- That is, as each image is tiled onto the composite image it is scaled
- to fit the maximum width and height of the tiled area while respecting
- the aspect ratio of the original image. \fB\+aspect_ratio\fP means the
- image is scaled to exactly the dimensions of the tiled image as
- specified by \fB\-geometry\fP.
- .TP 5
- .B "-clip \fI<width>x<height>+<x offset>+<y offset>\fP"
- preferred size and location of the clipped image. See \fBX(1)\fP for details
- about the geometry specification.
- X
- Use clipping to tile only a particular area of an image.
- X
- The equivalent X resource for this option is \fBclipGeometry\fP
- (class \fBClipGeometry\fP). See \fBX RESOURCES\fP for details.
- .TP 5
- .B "-colors \fIvalue\fP"
- preferred number of colors in the image.
- X
- The actual number of colors in the image may be less than your request,
- but never more. Note, this is a color reduction option. Images with
- less unique colors than specified with this option will remain unchanged.
- Refer to \fBquantize(9)\fP for more details.
- X
- Note, options \fB-dither\fP, \fB-colorspace\fP, and \fB-treedepth\fP affect
- the color reduction algorithm.
- .TP 5
- .B "-colorspace \fIvalue\fP"
- the type of colorspace: \fBGRAY\fP, \fBRGB\fP, \fBXYZ\fP, \fBYCbCr\fP,
- \fBYIQ\fP, or \fBYUV\fP.
- X
- Color reduction, by default, takes place in the RGB color space.
- Empirical evidence suggests that distances in color spaces such as YUV
- or YIQ correspond to perceptual color differences more closely
- than do distances in RGB space. These color spaces may give better
- results when color reducing an image. Refer to \fBquantize(9)\fP for
- more details.
- X
- The \fB-colors\fP or \fB-monochrome\fP option is required for this option
- to take effect.
- .TP 5
- .B "-compose \fIoperator\fP"
- the type of image composition.
- X
- By default, each of the composite image pixels are replaced by the
- cooresponding image tile pixel. You can choose an alternate composite
- operation:
- X
- X over
- X in
- X out
- X atop
- X xor
- X plus
- X minus
- X add
- X subtract
- X difference
- X replace
- .PP
- The operations behaves as follows:
- .TP 9
- .B over
- The result will be the union of the two image shapes, with \fIimage\fP
- obscuring \fIcomposite image\fP in the region of overlap.
- .TP 9
- .B in
- The result is simply \fIimage\fP cut by the shape of \fIimage
- window\fP. None of the image data of \fIcomposite image\fP will be in the
- result.
- .TP 9
- .B out
- The resulting image is \fIimage\fP with the shape of \fIcomposite image\fP
- cut out.
- .TP 9
- .B atop
- The result is the same shape as image \fIcomposite image\fP, with
- \fIimage\fP obscuring \fIcomposite image\fP where the image shapes
- overlap. Note this differs from \fBover\fP because the portion of
- \fIimage\fP outside \fIcomposite image\fP's shape does not appear in the
- result.
- .TP 9
- .B xor
- The result is the image data from both \fIimage\fP and \fIcomposite image\fP
- that is outside the overlap region. The overlap region will be blank.
- .TP 9
- .B plus
- The result is just the sum of the image data. Output values are
- clipped to 255 (no overflow). This operation is independent
- of the alpha channels.
- .TP 9
- .B minus
- The result of \fIimage\fP \- \fIcomposite image\fP, with underflow clipped
- to zero. The alpha channel is ignored (set to 255, full coverage).
- .TP 9
- .B add
- The result of \fIimage\fP + \fIcomposite image\fP, with overflow wrapping
- around (\fImod\fP 256).
- .TP 9
- .B subtract
- The result of \fIimage\fP - \fIcomposite image\fP, with underflow wrapping
- around (\fImod\fP 256). The \fBadd\fP and \fBsubtract\fP operators can
- be used to perform reversible transformations.
- .TP 9
- .B difference
- The result of abs(\fIimage\fP \- \fIcomposite image\fP). This is useful
- for comparing two very similar images.
- .TP 9
- .B replace
- The resulting image is \fIcomposite image\fP replaced with \fIimage\fP.
- Here the alpha information is ignored.
- X
- The image compositor requires an alpha, or matte channel in the image
- for some operations. This extra channel usually defines a mask which
- represents a sort of a cookie-cutter for the image. This is the case
- when alpha is 255 (full coverage) for pixels inside the shape, zero
- outside, and between zero and 255 on the boundary. If \fIimage\fP does
- not have an alpha channel, it is initialized with 0 for any pixel
- matching in color to pixel location (0,0), otherwise 255 (to work
- properly \fBborderwidth\fP must be 0).
- .TP 5
- .B "-compress \fItype\fP"
- the type of image compression: \fIQEncoded\fP or \fIRunlengthEncoded\fP.
- X
- This option specifies the type of image compression for the composite
- image. See \fBmiff(5)\fP for details.
- X
- Specify \fB\+compress\fP to store the binary image in an uncompressed format.
- The default is the compression type of the specified image file.
- .TP 5
- .B "-density \fI<width>x<height>
- vertical and horizonal density of the image.
- X
- This option specifies an image density whose interpretation changes
- with the type of image. The default is 72 dots per inch in the
- horizonal and vertical direction for Postscript. Text files default to
- 80 characters in width and 60 lines in height. Use this option to
- alter the default density.
- .TP 5
- .B "-display \fIhost:display[.screen]\fP"
- specifies the X server to contact; see \fBX(1)\fP.
- X
- Specify \fB+display\fP if an X server is not available. The label font
- is obtained from the X server. If none is available, the composite image
- will not have labels.
- .TP 5
- .B "-dither"
- apply Floyd/Steinberg error diffusion to the image.
- X
- The basic strategy of dithering is to trade intensity resolution for
- spatial resolution by averaging the intensities of several neighboring
- pixels. Images which suffer from severe contouring when reducing colors
- can be improved with this option.
- X
- The \fB-colors\fP or \fB-monochrome\fP option is required
- for this option to take effect.
- .TP 5
- .B "-frame"
- surround image with an ornamental border.
- X
- Specify the width of the border with \fB-borderwidth\fP. Use
- \fB-gravity\fP to specify how the image is oriented within the
- ornamental border.
- .TP 5
- .B "-gamma \fIvalue\fP"
- level of gamma correction.
- X
- The same color image displayed on two different workstations may look
- different due to differences in the display monitor. Use gamma
- correction to adjust for this color difference. Reasonable values
- extend from 0.8 to 2.3.
- .TP 5
- .B "-geometry \fI<width>x<height>+<border width>+<border height>\fP"
- preferred tile and border size of each tile of the composite image.
- See \fBX(1)\fP for details about the geometry specification. By default,
- the tile size is 256x256 and there is no border.
- X
- The tile size you specify is a maximum size. Each image is scaled to
- fit the maximum size while still retaining its original aspect ratio.
- Each image is surrounded by a border whose size in pixels is specified
- as \fI<border width>\fP and \fI<border height>\fP and whose color is
- the background color.
- X
- The equivalent X resource for this option is \fBimageGeometry\fP
- (class \fBImageGeometry\fP). See \fBX RESOURCES\fP for details.
- .TP 5
- .B "-gravity \fIdirection\fP"
- direction image gravitates to within a tile. See \fBX(1)\fP for details
- about the gravity specification.
- X
- A tile of the composite image is a fixed width and height. However,
- the image within the tile may not fill it completely (see
- \fB-aspect_ratio\fP). The direction you specify indicates where to
- position the image within the tile. For example \fICenter\fP gravity
- forces the image to be centered within the tile. By default, the image
- gravity is \fINorth\fP.
- .TP 5
- .B "-interlace \fItype\fP"
- the type of interlacing scheme: \fBNONE\fP, \fBLINE\fP, or \fBPLANE\fP.
- X
- This option is used to specify the type of interlacing scheme for raw
- image formats such as \fBRGB\fP or \fBYUV\fP. \fBNONE\fP means do not
- interlace (RGBRGBRGBRGBRGBRGB...), \fBLINE\fP uses scanline
- interlacing (RRR...GGG...BBB...RRR...GGG...BBB...), and \fBPLANE\fP uses
- plane interlacing (RRRRRR...GGGGGG...BBBBBB...).
- .TP 5
- .B "-monochrome"
- transform the image to black and white.
- X
- Monochrome images can benefit from error diffusion. Use \fB-dither\fP with
- this option to diffuse the error.
- .TP 5
- .B "-page \fI<width>x<height>{\+-}<x offset>{\+-}<y offset>\fP"
- preferred size and location of the Postscript page.
- X
- Use this option to specify the dimensions of the Postscript page in picas. The
- default is to center the image on a letter page, 612 by 792 picas.
- Other common sizes are:
- X
- X 540x720 Note
- X 612x1008 Legal
- X 842x1190 A3
- X 595x842 A4
- X 421x595 A5
- X 297x421 A6
- X 709x1002 B4
- X 612x936 U.S. Foolscap
- X 612x936 European Foolscap
- X 396x612 Half Letter
- X 792x1224 11x17
- X 1224x792 Ledger
- X
- The page geometry is relative to the vertical and horizonal density of the
- Postscript page. See \fB-density\fP for details.
- .TP 5
- .B "-quality \fIvalue\fP"
- JPEG quality setting.
- X
- Quality is 0 (worst) to 100 (best). The default is 75.
- .TP 5
- .B "-rotate \fIdegrees\fP"
- apply Paeth image rotation to the image.
- X
- Empty triangles left over from rotating the image are filled with
- the color defined by the pixel at location (0,0).
- .TP 5
- .B "-tiles_per_row \fIvalue\fP"
- specifies how many images are to appear in each row of the composite image.
- The default is to have an equal number of images in each row and column of
- the composite.
- .TP 5
- .B "-treedepth \fIvalue\fP"
- Normally, this integer value is zero or one. A zero or one tells
- \fBmontage\fP to choose a optimal tree depth for the color reduction
- algorithm.
- X
- An optimal depth generally allows the best representation of the source
- image with the fastest computational speed and the least amount of
- memory. However, the default depth is inappropriate for some images.
- To assure the best representation, try values between 2 and 8 for this
- parameter. Refer to \fBquantize(9)\fP for more details.
- X
- The \fB-colors\fP or \fB-monochrome\fP option is required for this option
- to take effect.
- .TP 5
- .B -verbose
- print detailed information about the image.
- X
- This information is printed: image scene number; image name; image size;
- the image class (\fIDirectClass\fP or \fIPseudoClass\fP); the total
- number of unique colors; and the number of seconds to read and write the
- image.
- .PP
- In addition to those listed above, you can specify these standard X
- resources as command line options: -background, -bordercolor, -borderwidth,
- -font, -foreground, -title.
- See \fBX RESOURCES\fP for details.
- .PP
- Any option you specify on the command line remains in effect until it is
- explicitly changed by specifying the option again with a different effect.
- For example, to montage two images, the first with 32 colors and the
- second with only 16 colors, use:
- .PP
- X montage -colors 32 cockatoo.1 -colors 16 cockatoo.2 cockatoo.miff
- .PP
- Change \fI-\fP to \fI\+\fP in any option above to reverse its effect.
- For example, specify \fB\+dither\fP to not apply error diffusion to an
- image.
- .PP
- By default, the image format 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). See \fBconvert(1)\fP for a list
- of valid image formats.
- .PP
- When you specify \fBX\fP as your image type, the filename has special
- meaning. It specifies an X window by id, name, or \fBroot\fP. If no
- filename is specified, the window is selected by clicking the mouse in
- the desired window.
- .PP
- Specify \fIfile\fP as \fI-\fP for standard input, \fIoutput_file\fP as
- \fI-\fP for standard output. If \fIfile\fP has the extension \fB.Z\fP
- or \fB.gz\fP, the file is uncompressed with \fBuncompress\fP or
- \fBgunzip\fP respectively. If \fIoutput_file\fP has the extension
- \fB.Z\fP or \fB.gz\fP, the file size is compressed using with
- \fBcompress\fP or \fBgzip\fP respectively. If \fIoutput_file\fP
- already exists, you will be prompted as to whether it should be
- overwritten.
- .PP
- Note, a composite MIFF image displayed to an X server with
- \fBdisplay\fP behaves differently than other images. You can think of
- the composite as a visual image directory. Choose a particular tile of
- the composite and press a button to display it. See \fBdisplay(1)\fP
- and \fBmiff(5)\fP for details.
- .SH "X RESOURCES"
- \fBmontage\fP options can appear on the command line or in your X
- resource file. Options on the command line supersede values specified
- in your X resource file. See \fBX(1)\fP for more information on X
- resources.
- X
- All \fBmontage\fP options have a corresponding X resource. In addition,
- \fBmontage\fP uses the following X resources:
- .TP 5
- .B background (\fPclass\fB Background)
- Specifies the preferred color to use for the composite image background. The
- default is black.
- .TP 5
- .B borderColor (\fPclass\fB BorderColor)
- Specifies the preferred color to use for the composite image border. The
- default is white.
- .TP 5
- .B borderWidth (\fPclass\fB BorderWidth)
- Specifies the width in pixels of the composite image border. The default is 2.
- .TP 5
- .B font (\fPclass\fB Font)
- Specifies the name of the preferred font to use when displaying text
- within the composite image. The default is 9x15, fixed, or 5x8 determined by
- the composite image size.
- .TP 5
- .B foreground (\fPclass\fB Foreground)
- Specifies the preferred color to use for text within the composite image. The
- default is white.
- .TP 5
- .B title (\fPclass\fB Title)
- This resource specifies the title to be placed at the top of the composite
- image. The default is not to place a title at the top of the composite image.
- .SH ENVIRONMENT
- .TP 5
- .B display
- To get the default host, display number, and screen.
- .SH SEE ALSO
- .B
- display(1), mogrify(1), convert(1), X(1), quantize(9), miff(5), compress(1)
- .SH COPYRIGHT
- Copyright 1993 E. I. du Pont de Nemours & Company
- .PP
- 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
- & 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 & Company makes no representations
- about the suitability of this software for any purpose. It is provided
- "as is" without express or implied warranty.
- .PP
- E. I. du Pont de Nemours & 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 & 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 tortious action, arising
- out of or in connection with the use or performance of this software.
- .SH ACKNOWLEDGEMENTS
- The MIT X Consortium for making network transparent graphics a reality.
- .PP
- Michael Halle, Spatial Imaging Group at MIT, for the initial
- implementation of Alan Paeth's image rotation algorithm.
- .PP
- David Pensak, E. I. du Pont de Nemours & Company, for providing a
- computing environment that made this program possible.
- .PP
- Paul Raveling, USC Information Sciences Institute, for the original
- idea of using space subdivision for the color reduction algorithm.
- .SH AUTHORS
- John Cristy, E.I. du Pont de Nemours & Company Incorporated
- SHAR_EOF
- chmod 0644 ImageMagick/montage.man ||
- echo 'restore of ImageMagick/montage.man failed'
- Wc_c="`wc -c < 'ImageMagick/montage.man'`"
- test 19241 -eq "$Wc_c" ||
- echo 'ImageMagick/montage.man: original size 19241, current size' "$Wc_c"
- rm -f _shar_wnt_.tmp
- fi
- # ============= ImageMagick/utility.c ==============
- if test -f 'ImageMagick/utility.c' -a X"$1" != X"-c"; then
- echo 'x - skipping ImageMagick/utility.c (File already exists)'
- rm -f _shar_wnt_.tmp
- else
- > _shar_wnt_.tmp
- echo 'x - extracting ImageMagick/utility.c (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'ImageMagick/utility.c' &&
- /*
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % %
- % %
- % %
- % U U TTTTT IIIII L IIIII TTTTT Y Y %
- % U U T I L I T Y Y %
- % U U T I L I T Y %
- % U U T I L I T Y %
- % UUU T IIIII LLLLL IIIII T Y %
- % %
- % %
- % ImageMagick Utility Routines %
- % %
- % %
- % %
- % Software Design %
- % John Cristy %
- % January 1993 %
- % %
- % %
- % Copyright 1993 E. I. du Pont de Nemours & 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 %
- % & 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 & 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 & 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 & 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 tortious action, arising %
- % out of or in connection with the use or performance of this software. %
- % %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- %
- */
- X
- /*
- X Include declarations.
- */
- #include "display.h"
- X
- /*
- X Forward declarations.
- */
- unsigned int
- X ReadData _Declare((char *,int,int,FILE *));
- X
- /*
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % %
- % %
- % %
- % L S B F i r s t R e a d L o n g %
- % %
- % %
- % %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Function LSBFirstReadLong reads a long value as a 32 bit quantity in
- % least-significant byte first order.
- %
- % The format of the LSBFirstReadLong routine is:
- %
- % value=LSBFirstReadLong(file)
- %
- % A description of each parameter follows.
- %
- % o value: Function LSBFirstReadLong returns an unsigned long read from
- % the file.
- %
- % o file: Specifies the file to read the data from.
- %
- %
- */
- unsigned long LSBFirstReadLong(file)
- FILE
- X *file;
- {
- X unsigned char
- X buffer[4];
- X
- X unsigned int
- X status;
- X
- X unsigned long
- X value;
- X
- X status=ReadData((char *) buffer,1,4,file);
- X if (status == False)
- X return((unsigned long) ~0);
- X value=(unsigned int) (buffer[3] << 24);
- X value|=(unsigned int) (buffer[2] << 16);
- X value|=(unsigned int) (buffer[1] << 8);
- X value|=(unsigned int) (buffer[0]);
- X return(value);
- }
- X
- /*
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % %
- % %
- % %
- % L S B F i r s t R e a d S h o r t %
- % %
- % %
- % %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Function LSBFirstReadShort reads a short value as a 16 bit quantity in
- % least-significant byte first order.
- %
- % The format of the LSBFirstReadShort routine is:
- %
- % value=LSBFirstReadShort(file)
- %
- % A description of each parameter follows.
- %
- % o value: Function LSBFirstReadShort returns an unsigned short read from
- % the file.
- %
- % o file: Specifies the file to read the data from.
- %
- %
- */
- unsigned short LSBFirstReadShort(file)
- FILE
- X *file;
- {
- X unsigned char
- X buffer[2];
- X
- X unsigned int
- X status;
- X
- X unsigned short
- X value;
- X
- X status=ReadData((char *) buffer,1,2,file);
- X if (status == False)
- X return((unsigned long) ~0);
- X value=(unsigned short) (buffer[1] << 8);
- X value|=(unsigned short) (buffer[0]);
- X return(value);
- }
- X
- /*
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % %
- % %
- % %
- % L S B F i r s t W r i t e L o n g %
- % %
- % %
- % %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Function LSBFirstWriteLong writes a long value as a 32 bit quantity in
- % least-significant byte first order.
- %
- % The format of the LSBFirstWriteLong routine is:
- %
- % LSBFirstWriteLong(value,file)
- %
- % A description of each parameter follows.
- %
- % o value: Specifies the value to write.
- %
- % o file: Specifies the file to write the data to.
- %
- %
- */
- void LSBFirstWriteLong(value,file)
- unsigned long
- X value;
- X
- FILE
- X *file;
- {
- X unsigned char
- X buffer[4];
- X
- X buffer[0]=(unsigned char) (value);
- X buffer[1]=(unsigned char) ((value) >> 8);
- X buffer[2]=(unsigned char) ((value) >> 16);
- X buffer[3]=(unsigned char) ((value) >> 24);
- X (void) fwrite((char *) buffer,1,4,file);
- }
- X
- /*
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % %
- % %
- % %
- % L S B F i r s t W r i t e S h o r t %
- % %
- % %
- % %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Function LSBFirstWriteShort writes a long value as a 16 bit quantity in
- % least-significant byte first order.
- %
- % The format of the LSBFirstWriteShort routine is:
- %
- % LSBFirstWriteShort(value,file)
- %
- % A description of each parameter follows.
- %
- % o value: Specifies the value to write.
- %
- % o file: Specifies the file to write the data to.
- %
- %
- */
- void LSBFirstWriteShort(value,file)
- unsigned int
- X value;
- X
- FILE
- X *file;
- {
- X unsigned char
- X buffer[2];
- X
- X buffer[0]=(unsigned char) (value);
- SHAR_EOF
- true || echo 'restore of ImageMagick/utility.c failed'
- fi
- echo 'End of ImageMagick part 32'
- echo 'File ImageMagick/utility.c is continued in part 33'
- echo 33 > _shar_seq_.tmp
- exit 0
-
- exit 0 # Just in case...
- --
- // chris@Sterling.COM | Send comp.sources.x submissions to:
- \X/ Amiga - The only way to fly! | sources-x@sterling.com
- "It's intuitively obvious to the |
- most casual observer..." | GCS d+/-- p+ c++ l+ m+ s++/+ g+ w+ t+ r+ x+
-