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