MagickWand 7.1.1
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
identify.c
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% IIIII DDDD EEEEE N N TTTTT IIIII FFFFF Y Y %
7% I D D E NN N T I F Y Y %
8% I D D EEE N N N T I FFF Y %
9% I D D E N NN T I F Y %
10% IIIII DDDD EEEEE N N T IIIII F Y %
11% %
12% %
13% Identify an Image Format and Characteristics. %
14% %
15% Software Design %
16% Cristy %
17% September 1994 %
18% %
19% %
20% Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization %
21% dedicated to making software imaging solutions freely available. %
22% %
23% You may not use this file except in compliance with the License. You may %
24% obtain a copy of the License at %
25% %
26% https://imagemagick.org/script/license.php %
27% %
28% Unless required by applicable law or agreed to in writing, software %
29% distributed under the License is distributed on an "AS IS" BASIS, %
30% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31% See the License for the specific language governing permissions and %
32% limitations under the License. %
33% %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36% The identify program describes the format and characteristics of one or more
37% image files. It also reports if an image is incomplete or corrupt. The
38% information returned includes the image number, the file name, the width and
39% height of the image, whether the image is colormapped or not, the number of
40% colors in the image, the number of bytes in the image, the format of the
41% image (JPEG, PNM, etc.), and finally the number of seconds it took to read
42% and process the image. Many more attributes are available with the verbose
43% option.
44%
45*/
46
47/*
48 Include declarations.
49*/
50#include "MagickWand/studio.h"
51#include "MagickWand/MagickWand.h"
52#include "MagickWand/mogrify-private.h"
53#include "MagickCore/string-private.h"
54
55/*
56%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57% %
58% %
59% %
60+ I d e n t i f y I m a g e C o m m a n d %
61% %
62% %
63% %
64%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65%
66% IdentifyImageCommand() describes the format and characteristics of one or
67% more image files. It will also report if an image is incomplete or corrupt.
68% The information displayed includes the scene number, the file name, the
69% width and height of the image, whether the image is colormapped or not,
70% the number of colors in the image, the number of bytes in the image, the
71% format of the image (JPEG, PNM, etc.), and finally the number of seconds
72% it took to read and process the image.
73%
74% The format of the IdentifyImageCommand method is:
75%
76% MagickBooleanType IdentifyImageCommand(ImageInfo *image_info,int argc,
77% char **argv,char **metadata,ExceptionInfo *exception)
78%
79% A description of each parameter follows:
80%
81% o image_info: the image info.
82%
83% o argc: the number of elements in the argument vector.
84%
85% o argv: A text array containing the command line arguments.
86%
87% o metadata: any metadata is returned here.
88%
89% o exception: return any errors or warnings in this structure.
90%
91*/
92
93static MagickBooleanType IdentifyUsage(void)
94{
95 static const char
96 miscellaneous[] =
97 " -debug events display copious debugging information\n"
98 " -help print program options\n"
99 " -list type print a list of supported option arguments\n"
100 " -log format format of debugging information\n"
101 " -version print version information",
102 operators[] =
103 " -auto-orient automagically orient (rotate) image\n"
104 " -channel mask set the image channel mask\n"
105 " -grayscale method convert image to grayscale\n"
106 " -negate replace every pixel with its complementary color",
107 settings[] =
108 " -alpha option on, activate, off, deactivate, set, opaque, copy\n"
109 " transparent, extract, background, or shape\n"
110 " -antialias remove pixel-aliasing\n"
111 " -authenticate password\n"
112 " decipher image with this password\n"
113 " -clip clip along the first path from the 8BIM profile\n"
114 " -clip-mask filename associate a clip mask with the image\n"
115 " -clip-path id clip along a named path from the 8BIM profile\n"
116 " -colorspace type alternate image colorspace\n"
117 " -crop geometry cut out a rectangular region of the image\n"
118 " -define format:option\n"
119 " define one or more image format options\n"
120 " -density geometry horizontal and vertical density of the image\n"
121 " -depth value image depth\n"
122 " -endian type endianness (MSB or LSB) of the image\n"
123 " -extract geometry extract area from image\n"
124 " -features distance analyze image features (e.g. contrast, correlation)\n"
125 " -format \"string\" output formatted image characteristics\n"
126 " -fuzz distance colors within this distance are considered equal\n"
127 " -gamma value of gamma correction\n"
128 " -interlace type type of image interlacing scheme\n"
129 " -interpolate method pixel color interpolation method\n"
130 " -limit type value pixel cache resource limit\n"
131 " -matte store matte channel if the image has one\n"
132 " -moments report image moments\n"
133 " -monitor monitor progress\n"
134 " -ping efficiently determine image attributes\n"
135 " -precision value maximum number of significant digits to print\n"
136 " -quiet suppress all warning messages\n"
137 " -regard-warnings pay attention to warning messages\n"
138 " -respect-parentheses settings remain in effect until parenthesis boundary\n"
139 " -sampling-factor geometry\n"
140 " horizontal and vertical sampling factor\n"
141 " -seed value seed a new sequence of pseudo-random numbers\n"
142 " -set attribute value set an image attribute\n"
143 " -size geometry width and height of image\n"
144 " -strip strip image of all profiles and comments\n"
145 " -unique display the number of unique colors in the image\n"
146 " -units type the units of image resolution\n"
147 " -verbose print detailed information about the image\n"
148 " -virtual-pixel method\n"
149 " virtual pixel access method";
150
151 ListMagickVersion(stdout);
152 (void) printf("Usage: %s [options ...] file [ [options ...] "
153 "file ... ]\n",GetClientName());
154 (void) printf("\nImage Settings:\n");
155 (void) puts(settings);
156 (void) printf("\nImage Operators:\n");
157 (void) puts(operators);
158 (void) printf("\nMiscellaneous Options:\n");
159 (void) puts(miscellaneous);
160 (void) printf(
161 "\nBy default, the image format of 'file' is determined by its magic\n");
162 (void) printf(
163 "number. To specify a particular image format, precede the filename\n");
164 (void) printf(
165 "with an image format name and a colon (i.e. ps:image) or specify the\n");
166 (void) printf(
167 "image type as the filename suffix (i.e. image.ps). Specify 'file' as\n");
168 (void) printf("'-' for standard input or output.\n");
169 return(MagickTrue);
170}
171
172WandExport MagickBooleanType IdentifyImageCommand(ImageInfo *image_info,
173 int argc,char **argv,char **metadata,ExceptionInfo *exception)
174{
175#define DestroyIdentify() \
176{ \
177 DestroyImageStack(); \
178 for (i=0; i < (ssize_t) argc; i++) \
179 argv[i]=DestroyString(argv[i]); \
180 argv=(char **) RelinquishMagickMemory(argv); \
181}
182#define ThrowIdentifyException(asperity,tag,option) \
183{ \
184 (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
185 option); \
186 DestroyIdentify(); \
187 return(MagickFalse); \
188}
189#define ThrowIdentifyInvalidArgumentException(option,argument) \
190{ \
191 (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
192 "InvalidArgument","'%s': %s",option,argument); \
193 DestroyIdentify(); \
194 return(MagickFalse); \
195}
196
197 const char
198 *format,
199 *option;
200
201 Image
202 *image;
203
205 image_stack[MaxImageStackDepth+1];
206
207 MagickBooleanType
208 fire,
209 pend,
210 respect_parenthesis;
211
212 MagickStatusType
213 status;
214
215 ssize_t
216 i;
217
218 size_t
219 count;
220
221 ssize_t
222 j,
223 k;
224
225 /*
226 Set defaults.
227 */
228 assert(image_info != (ImageInfo *) NULL);
229 assert(image_info->signature == MagickCoreSignature);
230 assert(exception != (ExceptionInfo *) NULL);
231 if (IsEventLogging() != MagickFalse)
232 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
233 if (argc == 2)
234 {
235 option=argv[1];
236 if ((LocaleCompare("version",option+1) == 0) ||
237 (LocaleCompare("-version",option+1) == 0))
238 {
239 ListMagickVersion(stdout);
240 return(MagickTrue);
241 }
242 }
243 if (argc < 2)
244 {
245 (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
246 "MissingArgument","%s","");
247 (void) IdentifyUsage();
248 return(MagickFalse);
249 }
250 count=0;
251 format=NULL;
252 j=1;
253 k=0;
254 NewImageStack();
255 option=(char *) NULL;
256 pend=MagickFalse;
257 respect_parenthesis=MagickFalse;
258 status=MagickTrue;
259 /*
260 Identify an image.
261 */
262 ReadCommandlLine(argc,&argv);
263 status=ExpandFilenames(&argc,&argv);
264 if (status == MagickFalse)
265 ThrowIdentifyException(ResourceLimitError,"MemoryAllocationFailed",
266 GetExceptionMessage(errno));
267 image_info->ping=MagickTrue;
268 for (i=1; i < (ssize_t) argc; i++)
269 {
270 option=argv[i];
271 if (LocaleCompare(option,"(") == 0)
272 {
273 FireImageStack(MagickFalse,MagickTrue,pend);
274 if (k == MaxImageStackDepth)
275 ThrowIdentifyException(OptionError,"ParenthesisNestedTooDeeply",
276 option);
277 PushImageStack();
278 continue;
279 }
280 if (LocaleCompare(option,")") == 0)
281 {
282 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
283 if (k == 0)
284 ThrowIdentifyException(OptionError,"UnableToParseExpression",option);
285 PopImageStack();
286 continue;
287 }
288 if (IsCommandOption(option) == MagickFalse)
289 {
290 char
291 *filename;
292
293 Image
294 *images;
295
296 ImageInfo
297 *identify_info;
298
299 /*
300 Read input image.
301 */
302 FireImageStack(MagickFalse,MagickFalse,pend);
303 identify_info=CloneImageInfo(image_info);
304 identify_info->verbose=MagickFalse;
305 filename=argv[i];
306 if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
307 filename=argv[++i];
308 if (identify_info->ping != MagickFalse)
309 images=PingImages(identify_info,filename,exception);
310 else
311 images=ReadImages(identify_info,filename,exception);
312 identify_info=DestroyImageInfo(identify_info);
313 status&=(MagickStatusType) (images != (Image *) NULL) &&
314 (exception->severity < ErrorException);
315 if (images == (Image *) NULL)
316 continue;
317 AppendImageStack(images);
318 FinalizeImageSettings(image_info,image,MagickFalse);
319 count=0;
320 for ( ; image != (Image *) NULL; image=GetNextImageInList(image))
321 {
322 if (image->scene == 0)
323 image->scene=count++;
324 if (format == (char *) NULL)
325 {
326 (void) IdentifyImage(image,stdout,image_info->verbose,exception);
327 continue;
328 }
329 if (metadata != (char **) NULL)
330 {
331 char
332 *text;
333
334 text=InterpretImageProperties(image_info,image,format,exception);
335 if (text == (char *) NULL)
336 ThrowIdentifyException(ResourceLimitError,
337 "MemoryAllocationFailed",GetExceptionMessage(errno));
338 (void) ConcatenateString(&(*metadata),text);
339 text=DestroyString(text);
340 }
341 }
342 RemoveAllImageStack();
343 continue;
344 }
345 pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
346 image_info->ping=MagickFalse;
347 switch (*(option+1))
348 {
349 case 'a':
350 {
351 if (LocaleCompare("alpha",option+1) == 0)
352 {
353 ssize_t
354 type;
355
356 if (*option == '+')
357 break;
358 i++;
359 if (i == (ssize_t) argc)
360 ThrowIdentifyException(OptionError,"MissingArgument",option);
361 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,
362 argv[i]);
363 if (type < 0)
364 ThrowIdentifyException(OptionError,
365 "UnrecognizedAlphaChannelOption",argv[i]);
366 break;
367 }
368 if (LocaleCompare("antialias",option+1) == 0)
369 break;
370 if (LocaleCompare("authenticate",option+1) == 0)
371 {
372 if (*option == '+')
373 break;
374 i++;
375 if (i == (ssize_t) argc)
376 ThrowIdentifyException(OptionError,"MissingArgument",option);
377 break;
378 }
379 if (LocaleCompare("auto-orient",option+1) == 0)
380 break;
381 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
382 }
383 case 'c':
384 {
385 if (LocaleCompare("cache",option+1) == 0)
386 {
387 if (*option == '+')
388 break;
389 i++;
390 if (i == (ssize_t) argc)
391 ThrowIdentifyException(OptionError,"MissingArgument",option);
392 if (IsGeometry(argv[i]) == MagickFalse)
393 ThrowIdentifyInvalidArgumentException(option,argv[i]);
394 break;
395 }
396 if (LocaleCompare("channel",option+1) == 0)
397 {
398 ssize_t
399 channel;
400
401 if (*option == '+')
402 break;
403 i++;
404 if (i == (ssize_t) argc)
405 ThrowIdentifyException(OptionError,"MissingArgument",option);
406 channel=ParseChannelOption(argv[i]);
407 if (channel < 0)
408 ThrowIdentifyException(OptionError,"UnrecognizedChannelType",
409 argv[i]);
410 break;
411 }
412 if (LocaleCompare("clip",option+1) == 0)
413 break;
414 if (LocaleCompare("clip-mask",option+1) == 0)
415 {
416 if (*option == '+')
417 break;
418 i++;
419 if (i == (ssize_t) argc)
420 ThrowIdentifyException(OptionError,"MissingArgument",option);
421 break;
422 }
423 if (LocaleCompare("clip-path",option+1) == 0)
424 {
425 i++;
426 if (i == (ssize_t) argc)
427 ThrowIdentifyException(OptionError,"MissingArgument",option);
428 break;
429 }
430 if (LocaleCompare("colorspace",option+1) == 0)
431 {
432 ssize_t
433 colorspace;
434
435 if (*option == '+')
436 break;
437 i++;
438 if (i == (ssize_t) argc)
439 ThrowIdentifyException(OptionError,"MissingArgument",option);
440 colorspace=ParseCommandOption(MagickColorspaceOptions,
441 MagickFalse,argv[i]);
442 if (colorspace < 0)
443 ThrowIdentifyException(OptionError,"UnrecognizedColorspace",
444 argv[i]);
445 break;
446 }
447 if (LocaleCompare("crop",option+1) == 0)
448 {
449 if (*option == '+')
450 break;
451 i++;
452 if (i == (ssize_t) argc)
453 ThrowIdentifyException(OptionError,"MissingArgument",option);
454 if (IsGeometry(argv[i]) == MagickFalse)
455 ThrowIdentifyInvalidArgumentException(option,argv[i]);
456 break;
457 }
458 if (LocaleCompare("concurrent",option+1) == 0)
459 break;
460 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
461 }
462 case 'd':
463 {
464 if (LocaleCompare("debug",option+1) == 0)
465 {
466 ssize_t
467 event;
468
469 if (*option == '+')
470 break;
471 i++;
472 if (i == (ssize_t) argc)
473 ThrowIdentifyException(OptionError,"MissingArgument",option);
474 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
475 if (event < 0)
476 ThrowIdentifyException(OptionError,"UnrecognizedEventType",
477 argv[i]);
478 (void) SetLogEventMask(argv[i]);
479 break;
480 }
481 if (LocaleCompare("define",option+1) == 0)
482 {
483 i++;
484 if (i == (ssize_t) argc)
485 ThrowIdentifyException(OptionError,"MissingArgument",option);
486 if (*option == '+')
487 {
488 const char
489 *define;
490
491 define=GetImageOption(image_info,argv[i]);
492 if (define == (const char *) NULL)
493 ThrowIdentifyException(OptionError,"NoSuchOption",argv[i]);
494 break;
495 }
496 break;
497 }
498 if (LocaleCompare("density",option+1) == 0)
499 {
500 if (*option == '+')
501 break;
502 i++;
503 if (i == (ssize_t) argc)
504 ThrowIdentifyException(OptionError,"MissingArgument",option);
505 if (IsGeometry(argv[i]) == MagickFalse)
506 ThrowIdentifyInvalidArgumentException(option,argv[i]);
507 break;
508 }
509 if (LocaleCompare("depth",option+1) == 0)
510 {
511 if (*option == '+')
512 break;
513 i++;
514 if (i == (ssize_t) argc)
515 ThrowIdentifyException(OptionError,"MissingArgument",option);
516 if (IsGeometry(argv[i]) == MagickFalse)
517 ThrowIdentifyInvalidArgumentException(option,argv[i]);
518 break;
519 }
520 if (LocaleCompare("duration",option+1) == 0)
521 {
522 if (*option == '+')
523 break;
524 i++;
525 if (i == (ssize_t) argc)
526 ThrowIdentifyException(OptionError,"MissingArgument",option);
527 if (IsGeometry(argv[i]) == MagickFalse)
528 ThrowIdentifyInvalidArgumentException(option,argv[i]);
529 break;
530 }
531 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
532 }
533 case 'e':
534 {
535 if (LocaleCompare("endian",option+1) == 0)
536 {
537 ssize_t
538 endian;
539
540 if (*option == '+')
541 break;
542 i++;
543 if (i == (ssize_t) argc)
544 ThrowIdentifyException(OptionError,"MissingArgument",option);
545 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
546 argv[i]);
547 if (endian < 0)
548 ThrowIdentifyException(OptionError,"UnrecognizedEndianType",
549 argv[i]);
550 break;
551 }
552 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
553 }
554 case 'f':
555 {
556 if (LocaleCompare("features",option+1) == 0)
557 {
558 if (*option == '+')
559 break;
560 i++;
561 if (i == (ssize_t) argc)
562 ThrowIdentifyException(OptionError,"MissingArgument",option);
563 if (IsGeometry(argv[i]) == MagickFalse)
564 ThrowIdentifyInvalidArgumentException(option,argv[i]);
565 break;
566 }
567 if (LocaleCompare("format",option+1) == 0)
568 {
569 format=(char *) NULL;
570 if (*option == '+')
571 break;
572 i++;
573 if (i == (ssize_t) argc)
574 ThrowIdentifyException(OptionError,"MissingArgument",option);
575 format=argv[i];
576 break;
577 }
578 if (LocaleCompare("fuzz",option+1) == 0)
579 {
580 if (*option == '+')
581 break;
582 i++;
583 if (i == (ssize_t) argc)
584 ThrowIdentifyException(OptionError,"MissingArgument",option);
585 if (IsGeometry(argv[i]) == MagickFalse)
586 ThrowIdentifyInvalidArgumentException(option,argv[i]);
587 break;
588 }
589 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
590 }
591 case 'g':
592 {
593 if (LocaleCompare("gamma",option+1) == 0)
594 {
595 i++;
596 if (i == (ssize_t) argc)
597 ThrowIdentifyException(OptionError,"MissingArgument",option);
598 if (IsGeometry(argv[i]) == MagickFalse)
599 ThrowIdentifyInvalidArgumentException(option,argv[i]);
600 break;
601 }
602 if (LocaleCompare("grayscale",option+1) == 0)
603 {
604 ssize_t
605 method;
606
607 if (*option == '+')
608 break;
609 i++;
610 if (i == (ssize_t) argc)
611 ThrowIdentifyException(OptionError,"MissingArgument",option);
612 method=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse,
613 argv[i]);
614 if (method < 0)
615 ThrowIdentifyException(OptionError,"UnrecognizedIntensityMethod",
616 argv[i]);
617 break;
618 }
619 if (LocaleCompare("green-primary",option+1) == 0)
620 {
621 if (*option == '+')
622 break;
623 i++;
624 if (i == (ssize_t) argc)
625 ThrowIdentifyException(OptionError,"MissingArgument",option);
626 if (IsGeometry(argv[i]) == MagickFalse)
627 ThrowIdentifyInvalidArgumentException(option,argv[i]);
628 break;
629 }
630 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
631 }
632 case 'h':
633 {
634 if ((LocaleCompare("help",option+1) == 0) ||
635 (LocaleCompare("-help",option+1) == 0))
636 {
637 DestroyIdentify();
638 return(IdentifyUsage());
639 }
640 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
641 }
642 case 'i':
643 {
644 if (LocaleCompare("interlace",option+1) == 0)
645 {
646 ssize_t
647 interlace;
648
649 if (*option == '+')
650 break;
651 i++;
652 if (i == (ssize_t) argc)
653 ThrowIdentifyException(OptionError,"MissingArgument",option);
654 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
655 argv[i]);
656 if (interlace < 0)
657 ThrowIdentifyException(OptionError,"UnrecognizedInterlaceType",
658 argv[i]);
659 break;
660 }
661 if (LocaleCompare("interpolate",option+1) == 0)
662 {
663 ssize_t
664 interpolate;
665
666 if (*option == '+')
667 break;
668 i++;
669 if (i == (ssize_t) argc)
670 ThrowIdentifyException(OptionError,"MissingArgument",option);
671 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
672 argv[i]);
673 if (interpolate < 0)
674 ThrowIdentifyException(OptionError,
675 "UnrecognizedInterpolateMethod",argv[i]);
676 break;
677 }
678 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
679 }
680 case 'l':
681 {
682 if (LocaleCompare("limit",option+1) == 0)
683 {
684 char
685 *p;
686
687 double
688 value;
689
690 ssize_t
691 resource;
692
693 if (*option == '+')
694 break;
695 i++;
696 if (i == (ssize_t) argc)
697 ThrowIdentifyException(OptionError,"MissingArgument",option);
698 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
699 argv[i]);
700 if (resource < 0)
701 ThrowIdentifyException(OptionError,"UnrecognizedResourceType",
702 argv[i]);
703 i++;
704 if (i == (ssize_t) argc)
705 ThrowIdentifyException(OptionError,"MissingArgument",option);
706 value=StringToDouble(argv[i],&p);
707 (void) value;
708 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
709 ThrowIdentifyInvalidArgumentException(option,argv[i]);
710 break;
711 }
712 if (LocaleCompare("list",option+1) == 0)
713 {
714 ssize_t
715 list;
716
717 if (*option == '+')
718 break;
719 i++;
720 if (i == (ssize_t) argc)
721 ThrowIdentifyException(OptionError,"MissingArgument",option);
722 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
723 if (list < 0)
724 ThrowIdentifyException(OptionError,"UnrecognizedListType",
725 argv[i]);
726 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
727 argv+j,exception);
728 DestroyIdentify();
729 return(status == 0 ? MagickFalse : MagickTrue);
730 }
731 if (LocaleCompare("log",option+1) == 0)
732 {
733 if (*option == '+')
734 break;
735 i++;
736 if ((i == (ssize_t) argc) ||
737 (strchr(argv[i],'%') == (char *) NULL))
738 ThrowIdentifyException(OptionError,"MissingArgument",option);
739 break;
740 }
741 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
742 }
743 case 'm':
744 {
745 if (LocaleCompare("mask",option+1) == 0)
746 {
747 if (*option == '+')
748 break;
749 i++;
750 if (i == (ssize_t) argc)
751 ThrowIdentifyException(OptionError,"MissingArgument",option);
752 break;
753 }
754 if (LocaleCompare("matte",option+1) == 0)
755 break;
756 if (LocaleCompare("moments",option+1) == 0)
757 break;
758 if (LocaleCompare("monitor",option+1) == 0)
759 break;
760 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
761 }
762 case 'n':
763 {
764 if (LocaleCompare("negate",option+1) == 0)
765 break;
766 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
767 }
768 case 'p':
769 {
770 if (LocaleCompare("ping",option+1) == 0)
771 {
772 image_info->ping=MagickTrue;
773 break;
774 }
775 if (LocaleCompare("precision",option+1) == 0)
776 {
777 if (*option == '+')
778 break;
779 i++;
780 if (i == (ssize_t) argc)
781 ThrowIdentifyException(OptionError,"MissingArgument",option);
782 if (IsGeometry(argv[i]) == MagickFalse)
783 ThrowIdentifyInvalidArgumentException(option,argv[i]);
784 break;
785 }
786 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
787 }
788 case 'q':
789 {
790 if (LocaleCompare("quiet",option+1) == 0)
791 break;
792 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
793 }
794 case 'r':
795 {
796 if (LocaleCompare("regard-warnings",option+1) == 0)
797 break;
798 if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
799 {
800 respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
801 break;
802 }
803 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
804 }
805 case 's':
806 {
807 if (LocaleCompare("sampling-factor",option+1) == 0)
808 {
809 if (*option == '+')
810 break;
811 i++;
812 if (i == (ssize_t) argc)
813 ThrowIdentifyException(OptionError,"MissingArgument",option);
814 if (IsGeometry(argv[i]) == MagickFalse)
815 ThrowIdentifyInvalidArgumentException(option,argv[i]);
816 break;
817 }
818 if (LocaleCompare("seed",option+1) == 0)
819 {
820 if (*option == '+')
821 break;
822 i++;
823 if (i == (ssize_t) argc)
824 ThrowIdentifyException(OptionError,"MissingArgument",option);
825 if (IsGeometry(argv[i]) == MagickFalse)
826 ThrowIdentifyInvalidArgumentException(option,argv[i]);
827 break;
828 }
829 if (LocaleCompare("set",option+1) == 0)
830 {
831 i++;
832 if (i == (ssize_t) argc)
833 ThrowIdentifyException(OptionError,"MissingArgument",option);
834 if (*option == '+')
835 break;
836 i++;
837 if (i == (ssize_t) argc)
838 ThrowIdentifyException(OptionError,"MissingArgument",option);
839 break;
840 }
841 if (LocaleCompare("size",option+1) == 0)
842 {
843 if (*option == '+')
844 break;
845 i++;
846 if (i == (ssize_t) argc)
847 ThrowIdentifyException(OptionError,"MissingArgument",option);
848 if (IsGeometry(argv[i]) == MagickFalse)
849 ThrowIdentifyInvalidArgumentException(option,argv[i]);
850 break;
851 }
852 if (LocaleCompare("strip",option+1) == 0)
853 break;
854 if (LocaleCompare("support",option+1) == 0)
855 {
856 if (*option == '+')
857 break;
858 i++;
859 if (i == (ssize_t) argc)
860 ThrowIdentifyException(OptionError,"MissingArgument",option);
861 if (IsGeometry(argv[i]) == MagickFalse)
862 ThrowIdentifyInvalidArgumentException(option,argv[i]);
863 break;
864 }
865 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
866 }
867 case 'u':
868 {
869 if (LocaleCompare("unique",option+1) == 0)
870 break;
871 if (LocaleCompare("units",option+1) == 0)
872 {
873 ssize_t
874 units;
875
876 if (*option == '+')
877 break;
878 i++;
879 if (i == (ssize_t) argc)
880 ThrowIdentifyException(OptionError,"MissingArgument",option);
881 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
882 argv[i]);
883 if (units < 0)
884 ThrowIdentifyException(OptionError,"UnrecognizedUnitsType",
885 argv[i]);
886 break;
887 }
888 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
889 }
890 case 'v':
891 {
892 if (LocaleCompare("verbose",option+1) == 0)
893 break;
894 if (LocaleCompare("virtual-pixel",option+1) == 0)
895 {
896 ssize_t
897 method;
898
899 if (*option == '+')
900 break;
901 i++;
902 if (i == (ssize_t) argc)
903 ThrowIdentifyException(OptionError,"MissingArgument",option);
904 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
905 argv[i]);
906 if (method < 0)
907 ThrowIdentifyException(OptionError,
908 "UnrecognizedVirtualPixelMethod",argv[i]);
909 break;
910 }
911 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
912 }
913 case '?':
914 break;
915 default:
916 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
917 }
918 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
919 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
920 if (fire != MagickFalse)
921 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
922 }
923 if (k != 0)
924 ThrowIdentifyException(OptionError,"UnbalancedParenthesis",argv[i]);
925 if (i != (ssize_t) argc)
926 ThrowIdentifyException(OptionError,"MissingAnImageFilename",argv[i]);
927 DestroyIdentify();
928 return(status != 0 ? MagickTrue : MagickFalse);
929}