MagickWand 7.1.1-39
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_parentheses;
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_parentheses=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 {
347 const OptionInfo
348 *option_info = GetCommandOptionInfo(option);
349
350 if (option_info != (const OptionInfo *) NULL)
351 {
352 CommandOptionFlags option_type = (CommandOptionFlags)
353 option_info->flags;
354 if ((option_type & (SimpleOperatorFlag | ListOperatorFlag)) != 0)
355 image_info->ping=MagickFalse;
356 }
357 }
358 switch (*(option+1))
359 {
360 case 'a':
361 {
362 if (LocaleCompare("alpha",option+1) == 0)
363 {
364 ssize_t
365 type;
366
367 if (*option == '+')
368 break;
369 i++;
370 if (i == (ssize_t) argc)
371 ThrowIdentifyException(OptionError,"MissingArgument",option);
372 type=ParseCommandOption(MagickAlphaChannelOptions,MagickFalse,
373 argv[i]);
374 if (type < 0)
375 ThrowIdentifyException(OptionError,
376 "UnrecognizedAlphaChannelOption",argv[i]);
377 break;
378 }
379 if (LocaleCompare("antialias",option+1) == 0)
380 break;
381 if (LocaleCompare("authenticate",option+1) == 0)
382 {
383 if (*option == '+')
384 break;
385 i++;
386 if (i == (ssize_t) argc)
387 ThrowIdentifyException(OptionError,"MissingArgument",option);
388 break;
389 }
390 if (LocaleCompare("auto-orient",option+1) == 0)
391 break;
392 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
393 }
394 case 'c':
395 {
396 if (LocaleCompare("cache",option+1) == 0)
397 {
398 if (*option == '+')
399 break;
400 i++;
401 if (i == (ssize_t) argc)
402 ThrowIdentifyException(OptionError,"MissingArgument",option);
403 if (IsGeometry(argv[i]) == MagickFalse)
404 ThrowIdentifyInvalidArgumentException(option,argv[i]);
405 break;
406 }
407 if (LocaleCompare("channel",option+1) == 0)
408 {
409 ssize_t
410 channel;
411
412 if (*option == '+')
413 break;
414 i++;
415 if (i == (ssize_t) argc)
416 ThrowIdentifyException(OptionError,"MissingArgument",option);
417 channel=ParseChannelOption(argv[i]);
418 if (channel < 0)
419 ThrowIdentifyException(OptionError,"UnrecognizedChannelType",
420 argv[i]);
421 break;
422 }
423 if (LocaleCompare("clip",option+1) == 0)
424 break;
425 if (LocaleCompare("clip-mask",option+1) == 0)
426 {
427 if (*option == '+')
428 break;
429 i++;
430 if (i == (ssize_t) argc)
431 ThrowIdentifyException(OptionError,"MissingArgument",option);
432 break;
433 }
434 if (LocaleCompare("clip-path",option+1) == 0)
435 {
436 i++;
437 if (i == (ssize_t) argc)
438 ThrowIdentifyException(OptionError,"MissingArgument",option);
439 break;
440 }
441 if (LocaleCompare("colorspace",option+1) == 0)
442 {
443 ssize_t
444 colorspace;
445
446 if (*option == '+')
447 break;
448 i++;
449 if (i == (ssize_t) argc)
450 ThrowIdentifyException(OptionError,"MissingArgument",option);
451 colorspace=ParseCommandOption(MagickColorspaceOptions,
452 MagickFalse,argv[i]);
453 if (colorspace < 0)
454 ThrowIdentifyException(OptionError,"UnrecognizedColorspace",
455 argv[i]);
456 break;
457 }
458 if (LocaleCompare("crop",option+1) == 0)
459 {
460 if (*option == '+')
461 break;
462 i++;
463 if (i == (ssize_t) argc)
464 ThrowIdentifyException(OptionError,"MissingArgument",option);
465 if (IsGeometry(argv[i]) == MagickFalse)
466 ThrowIdentifyInvalidArgumentException(option,argv[i]);
467 break;
468 }
469 if (LocaleCompare("concurrent",option+1) == 0)
470 break;
471 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
472 }
473 case 'd':
474 {
475 if (LocaleCompare("debug",option+1) == 0)
476 {
477 ssize_t
478 event;
479
480 if (*option == '+')
481 break;
482 i++;
483 if (i == (ssize_t) argc)
484 ThrowIdentifyException(OptionError,"MissingArgument",option);
485 event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
486 if (event < 0)
487 ThrowIdentifyException(OptionError,"UnrecognizedEventType",
488 argv[i]);
489 (void) SetLogEventMask(argv[i]);
490 break;
491 }
492 if (LocaleCompare("define",option+1) == 0)
493 {
494 i++;
495 if (i == (ssize_t) argc)
496 ThrowIdentifyException(OptionError,"MissingArgument",option);
497 if (*option == '+')
498 {
499 const char
500 *define;
501
502 define=GetImageOption(image_info,argv[i]);
503 if (define == (const char *) NULL)
504 ThrowIdentifyException(OptionError,"NoSuchOption",argv[i]);
505 break;
506 }
507 break;
508 }
509 if (LocaleCompare("density",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("depth",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 if (LocaleCompare("duration",option+1) == 0)
532 {
533 if (*option == '+')
534 break;
535 i++;
536 if (i == (ssize_t) argc)
537 ThrowIdentifyException(OptionError,"MissingArgument",option);
538 if (IsGeometry(argv[i]) == MagickFalse)
539 ThrowIdentifyInvalidArgumentException(option,argv[i]);
540 break;
541 }
542 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
543 }
544 case 'e':
545 {
546 if (LocaleCompare("endian",option+1) == 0)
547 {
548 ssize_t
549 endian;
550
551 if (*option == '+')
552 break;
553 i++;
554 if (i == (ssize_t) argc)
555 ThrowIdentifyException(OptionError,"MissingArgument",option);
556 endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
557 argv[i]);
558 if (endian < 0)
559 ThrowIdentifyException(OptionError,"UnrecognizedEndianType",
560 argv[i]);
561 break;
562 }
563 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
564 }
565 case 'f':
566 {
567 if (LocaleCompare("features",option+1) == 0)
568 {
569 if (*option == '+')
570 break;
571 i++;
572 if (i == (ssize_t) argc)
573 ThrowIdentifyException(OptionError,"MissingArgument",option);
574 if (IsGeometry(argv[i]) == MagickFalse)
575 ThrowIdentifyInvalidArgumentException(option,argv[i]);
576 break;
577 }
578 if (LocaleCompare("format",option+1) == 0)
579 {
580 format=(char *) NULL;
581 if (*option == '+')
582 break;
583 i++;
584 if (i == (ssize_t) argc)
585 ThrowIdentifyException(OptionError,"MissingArgument",option);
586 format=argv[i];
587 image_info->ping=MagickFalse;
588 break;
589 }
590 if (LocaleCompare("fuzz",option+1) == 0)
591 {
592 if (*option == '+')
593 break;
594 i++;
595 if (i == (ssize_t) argc)
596 ThrowIdentifyException(OptionError,"MissingArgument",option);
597 if (IsGeometry(argv[i]) == MagickFalse)
598 ThrowIdentifyInvalidArgumentException(option,argv[i]);
599 break;
600 }
601 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
602 }
603 case 'g':
604 {
605 if (LocaleCompare("gamma",option+1) == 0)
606 {
607 i++;
608 if (i == (ssize_t) argc)
609 ThrowIdentifyException(OptionError,"MissingArgument",option);
610 if (IsGeometry(argv[i]) == MagickFalse)
611 ThrowIdentifyInvalidArgumentException(option,argv[i]);
612 break;
613 }
614 if (LocaleCompare("grayscale",option+1) == 0)
615 {
616 ssize_t
617 method;
618
619 if (*option == '+')
620 break;
621 i++;
622 if (i == (ssize_t) argc)
623 ThrowIdentifyException(OptionError,"MissingArgument",option);
624 method=ParseCommandOption(MagickPixelIntensityOptions,MagickFalse,
625 argv[i]);
626 if (method < 0)
627 ThrowIdentifyException(OptionError,"UnrecognizedIntensityMethod",
628 argv[i]);
629 break;
630 }
631 if (LocaleCompare("green-primary",option+1) == 0)
632 {
633 if (*option == '+')
634 break;
635 i++;
636 if (i == (ssize_t) argc)
637 ThrowIdentifyException(OptionError,"MissingArgument",option);
638 if (IsGeometry(argv[i]) == MagickFalse)
639 ThrowIdentifyInvalidArgumentException(option,argv[i]);
640 break;
641 }
642 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
643 }
644 case 'h':
645 {
646 if ((LocaleCompare("help",option+1) == 0) ||
647 (LocaleCompare("-help",option+1) == 0))
648 {
649 DestroyIdentify();
650 return(IdentifyUsage());
651 }
652 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
653 }
654 case 'i':
655 {
656 if (LocaleCompare("interlace",option+1) == 0)
657 {
658 ssize_t
659 interlace;
660
661 if (*option == '+')
662 break;
663 i++;
664 if (i == (ssize_t) argc)
665 ThrowIdentifyException(OptionError,"MissingArgument",option);
666 interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
667 argv[i]);
668 if (interlace < 0)
669 ThrowIdentifyException(OptionError,"UnrecognizedInterlaceType",
670 argv[i]);
671 break;
672 }
673 if (LocaleCompare("interpolate",option+1) == 0)
674 {
675 ssize_t
676 interpolate;
677
678 if (*option == '+')
679 break;
680 i++;
681 if (i == (ssize_t) argc)
682 ThrowIdentifyException(OptionError,"MissingArgument",option);
683 interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
684 argv[i]);
685 if (interpolate < 0)
686 ThrowIdentifyException(OptionError,
687 "UnrecognizedInterpolateMethod",argv[i]);
688 break;
689 }
690 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
691 }
692 case 'l':
693 {
694 if (LocaleCompare("limit",option+1) == 0)
695 {
696 char
697 *p;
698
699 double
700 value;
701
702 ssize_t
703 resource;
704
705 if (*option == '+')
706 break;
707 i++;
708 if (i == (ssize_t) argc)
709 ThrowIdentifyException(OptionError,"MissingArgument",option);
710 resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
711 argv[i]);
712 if (resource < 0)
713 ThrowIdentifyException(OptionError,"UnrecognizedResourceType",
714 argv[i]);
715 i++;
716 if (i == (ssize_t) argc)
717 ThrowIdentifyException(OptionError,"MissingArgument",option);
718 value=StringToDouble(argv[i],&p);
719 (void) value;
720 if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
721 ThrowIdentifyInvalidArgumentException(option,argv[i]);
722 break;
723 }
724 if (LocaleCompare("list",option+1) == 0)
725 {
726 ssize_t
727 list;
728
729 if (*option == '+')
730 break;
731 i++;
732 if (i == (ssize_t) argc)
733 ThrowIdentifyException(OptionError,"MissingArgument",option);
734 list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
735 if (list < 0)
736 ThrowIdentifyException(OptionError,"UnrecognizedListType",
737 argv[i]);
738 status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
739 argv+j,exception);
740 DestroyIdentify();
741 return(status == 0 ? MagickFalse : MagickTrue);
742 }
743 if (LocaleCompare("log",option+1) == 0)
744 {
745 if (*option == '+')
746 break;
747 i++;
748 if ((i == (ssize_t) argc) ||
749 (strchr(argv[i],'%') == (char *) NULL))
750 ThrowIdentifyException(OptionError,"MissingArgument",option);
751 break;
752 }
753 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
754 }
755 case 'm':
756 {
757 if (LocaleCompare("mask",option+1) == 0)
758 {
759 if (*option == '+')
760 break;
761 i++;
762 if (i == (ssize_t) argc)
763 ThrowIdentifyException(OptionError,"MissingArgument",option);
764 break;
765 }
766 if (LocaleCompare("matte",option+1) == 0)
767 break;
768 if (LocaleCompare("moments",option+1) == 0)
769 break;
770 if (LocaleCompare("monitor",option+1) == 0)
771 break;
772 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
773 }
774 case 'n':
775 {
776 if (LocaleCompare("negate",option+1) == 0)
777 break;
778 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
779 }
780 case 'p':
781 {
782 if (LocaleCompare("ping",option+1) == 0)
783 {
784 image_info->ping=MagickTrue;
785 break;
786 }
787 if (LocaleCompare("precision",option+1) == 0)
788 {
789 if (*option == '+')
790 break;
791 i++;
792 if (i == (ssize_t) argc)
793 ThrowIdentifyException(OptionError,"MissingArgument",option);
794 if (IsGeometry(argv[i]) == MagickFalse)
795 ThrowIdentifyInvalidArgumentException(option,argv[i]);
796 break;
797 }
798 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
799 }
800 case 'q':
801 {
802 if (LocaleCompare("quiet",option+1) == 0)
803 break;
804 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
805 }
806 case 'r':
807 {
808 if (LocaleCompare("regard-warnings",option+1) == 0)
809 break;
810 if ((LocaleNCompare("respect-parentheses",option+1,17) == 0) ||
811 (LocaleNCompare("respect-parenthesis",option+1,17) == 0))
812 {
813 respect_parentheses=(*option == '-') ? MagickTrue : MagickFalse;
814 break;
815 }
816 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
817 }
818 case 's':
819 {
820 if (LocaleCompare("sampling-factor",option+1) == 0)
821 {
822 if (*option == '+')
823 break;
824 i++;
825 if (i == (ssize_t) argc)
826 ThrowIdentifyException(OptionError,"MissingArgument",option);
827 if (IsGeometry(argv[i]) == MagickFalse)
828 ThrowIdentifyInvalidArgumentException(option,argv[i]);
829 break;
830 }
831 if (LocaleCompare("seed",option+1) == 0)
832 {
833 if (*option == '+')
834 break;
835 i++;
836 if (i == (ssize_t) argc)
837 ThrowIdentifyException(OptionError,"MissingArgument",option);
838 if (IsGeometry(argv[i]) == MagickFalse)
839 ThrowIdentifyInvalidArgumentException(option,argv[i]);
840 break;
841 }
842 if (LocaleCompare("set",option+1) == 0)
843 {
844 i++;
845 if (i == (ssize_t) argc)
846 ThrowIdentifyException(OptionError,"MissingArgument",option);
847 if (*option == '+')
848 break;
849 i++;
850 if (i == (ssize_t) argc)
851 ThrowIdentifyException(OptionError,"MissingArgument",option);
852 break;
853 }
854 if (LocaleCompare("size",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 if (LocaleCompare("strip",option+1) == 0)
866 break;
867 if (LocaleCompare("support",option+1) == 0)
868 {
869 if (*option == '+')
870 break;
871 i++;
872 if (i == (ssize_t) argc)
873 ThrowIdentifyException(OptionError,"MissingArgument",option);
874 if (IsGeometry(argv[i]) == MagickFalse)
875 ThrowIdentifyInvalidArgumentException(option,argv[i]);
876 break;
877 }
878 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
879 }
880 case 'u':
881 {
882 if (LocaleCompare("unique",option+1) == 0)
883 break;
884 if (LocaleCompare("units",option+1) == 0)
885 {
886 ssize_t
887 units;
888
889 if (*option == '+')
890 break;
891 i++;
892 if (i == (ssize_t) argc)
893 ThrowIdentifyException(OptionError,"MissingArgument",option);
894 units=ParseCommandOption(MagickResolutionOptions,MagickFalse,
895 argv[i]);
896 if (units < 0)
897 ThrowIdentifyException(OptionError,"UnrecognizedUnitsType",
898 argv[i]);
899 break;
900 }
901 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
902 }
903 case 'v':
904 {
905 if (LocaleCompare("verbose",option+1) == 0)
906 break;
907 if (LocaleCompare("virtual-pixel",option+1) == 0)
908 {
909 ssize_t
910 method;
911
912 if (*option == '+')
913 break;
914 i++;
915 if (i == (ssize_t) argc)
916 ThrowIdentifyException(OptionError,"MissingArgument",option);
917 method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
918 argv[i]);
919 if (method < 0)
920 ThrowIdentifyException(OptionError,
921 "UnrecognizedVirtualPixelMethod",argv[i]);
922 break;
923 }
924 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
925 }
926 case '?':
927 break;
928 default:
929 ThrowIdentifyException(OptionError,"UnrecognizedOption",option)
930 }
931 fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
932 FireOptionFlag) == 0 ? MagickFalse : MagickTrue;
933 if (fire != MagickFalse)
934 FireImageStack(MagickFalse,MagickTrue,MagickTrue);
935 }
936 if (k != 0)
937 ThrowIdentifyException(OptionError,"UnbalancedParenthesis",argv[i]);
938 if (i != (ssize_t) argc)
939 ThrowIdentifyException(OptionError,"MissingAnImageFilename",argv[i]);
940 DestroyIdentify();
941 return(status != 0 ? MagickTrue : MagickFalse);
942}