Home | History | Annotate | Download | only in MagickWand
      1 /*
      2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      3 %                                                                             %
      4 %                                                                             %
      5 %                                                                             %
      6 %                 SSSSS  TTTTT  RRRR   EEEEE   AAA   M   M                    %
      7 %                 SS       T    R   R  E      A   A  MM MM                    %
      8 %                  SSS     T    RRRR   EEE    AAAAA  M M M                    %
      9 %                    SS    T    R R    E      A   A  M   M                    %
     10 %                 SSSSS    T    R  R   EEEEE  A   A  M   M                    %
     11 %                                                                             %
     12 %                                                                             %
     13 %                     Stream Image to a Raw Image Format                      %
     14 %                                                                             %
     15 %                           Software Design                                   %
     16 %                                Cristy                                       %
     17 %                              July 1992                                      %
     18 %                                                                             %
     19 %                                                                             %
     20 %  Copyright 1999-2019 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 %  Stream is a lightweight tool to stream one or more pixel components of the
     37 %  image or portion of the image to your choice of storage formats. It writes
     38 %  the pixel components as they are read from the input image a row at a time
     39 %  making stream desirable when working with large images or when you require
     40 %  raw pixel components.
     41 %
     42 */
     43 
     44 /*
     46   Include declarations.
     47 */
     48 #include "MagickWand/studio.h"
     49 #include "MagickWand/MagickWand.h"
     50 #include "MagickWand/mogrify-private.h"
     51 #include "MagickCore/stream-private.h"
     52 #include "MagickCore/string-private.h"
     53 
     54 /*
     56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     57 %                                                                             %
     58 %                                                                             %
     59 %                                                                             %
     60 %   S t r e a m I m a g e C o m m a n d                                       %
     61 %                                                                             %
     62 %                                                                             %
     63 %                                                                             %
     64 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     65 %
     66 %  StreamImageCommand() is a lightweight method designed to extract pixels
     67 %  from large image files to a raw format using a minimum of system resources.
     68 %  The entire image or any regular portion of the image can be extracted.
     69 %
     70 %  The format of the StreamImageCommand method is:
     71 %
     72 %      MagickBooleanType StreamImageCommand(ImageInfo *image_info,int argc,
     73 %        char **argv,char **metadata,ExceptionInfo *exception)
     74 %
     75 %  A description of each parameter follows:
     76 %
     77 %    o image_info: the image info.
     78 %
     79 %    o argc: the number of elements in the argument vector.
     80 %
     81 %    o argv: A text array containing the command line arguments.
     82 %
     83 %    o metadata: any metadata is returned here.
     84 %
     85 %    o exception: return any errors or warnings in this structure.
     86 %
     87 */
     88 
     89 static MagickBooleanType StreamUsage(void)
     90 {
     91   const char
     92     **p;
     93 
     94   static const char
     95     *miscellaneous[]=
     96     {
     97       "-channel mask        set the image channel mask",
     98       "-debug events        display copious debugging information",
     99       "-help                print program options",
    100       "-list type           print a list of supported option arguments",
    101       "-log format          format of debugging information",
    102       "-version             print version information",
    103       (char *) NULL
    104     },
    105     *settings[]=
    106     {
    107       "-authenticate password",
    108       "                     decipher image with this password",
    109       "-colorspace type     alternate image colorspace",
    110       "-compress type       type of pixel compression when writing the image",
    111       "-define format:option",
    112       "                     define one or more image format options",
    113       "-density geometry    horizontal and vertical density of the image",
    114       "-depth value         image depth",
    115       "-extract geometry    extract area from image",
    116       "-identify            identify the format and characteristics of the image",
    117       "-interlace type      type of image interlacing scheme",
    118       "-interpolate method  pixel color interpolation method",
    119       "-limit type value    pixel cache resource limit",
    120       "-map components      one or more pixel components",
    121       "-monitor             monitor progress",
    122       "-quantize colorspace reduce colors in this colorspace",
    123       "-quiet               suppress all warning messages",
    124       "-regard-warnings     pay attention to warning messages",
    125       "-respect-parentheses settings remain in effect until parenthesis boundary",
    126       "-sampling-factor geometry",
    127       "                     horizontal and vertical sampling factor",
    128       "-seed value          seed a new sequence of pseudo-random numbers",
    129       "-set attribute value set an image attribute",
    130       "-size geometry       width and height of image",
    131       "-storage-type type   pixel storage type",
    132       "-synchronize         synchronize image to storage device",
    133       "-taint               declare the image as modified",
    134       "-transparent-color color",
    135       "                     transparent color",
    136       "-verbose             print detailed information about the image",
    137       "-virtual-pixel method",
    138       "                     virtual pixel access method",
    139       (char *) NULL
    140     };
    141 
    142   ListMagickVersion(stdout);
    143   (void) printf("Usage: %s [options ...] input-image raw-image\n",
    144     GetClientName());
    145   (void) printf("\nImage Settings:\n");
    146   for (p=settings; *p != (char *) NULL; p++)
    147     (void) printf("  %s\n",*p);
    148   (void) printf("\nMiscellaneous Options:\n");
    149   for (p=miscellaneous; *p != (char *) NULL; p++)
    150     (void) printf("  %s\n",*p);
    151   (void) printf(
    152     "\nBy default, the image format of 'file' is determined by its magic\n");
    153   (void) printf(
    154     "number.  To specify a particular image format, precede the filename\n");
    155   (void) printf(
    156     "with an image format name and a colon (i.e. ps:image) or specify the\n");
    157   (void) printf(
    158     "image type as the filename suffix (i.e. image.ps).  Specify 'file' as\n");
    159   (void) printf("'-' for standard input or output.\n");
    160   return(MagickFalse);
    161 }
    162 
    163 WandExport MagickBooleanType StreamImageCommand(ImageInfo *image_info,
    164   int argc,char **argv,char **metadata,ExceptionInfo *exception)
    165 {
    166 #define DestroyStream() \
    167 { \
    168   DestroyImageStack(); \
    169   stream_info=DestroyStreamInfo(stream_info); \
    170   for (i=0; i < (ssize_t) argc; i++) \
    171     argv[i]=DestroyString(argv[i]); \
    172   argv=(char **) RelinquishMagickMemory(argv); \
    173 }
    174 #define ThrowStreamException(asperity,tag,option) \
    175 { \
    176   (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
    177     option); \
    178   DestroyStream(); \
    179   return(MagickFalse); \
    180 }
    181 #define ThrowStreamInvalidArgumentException(option,argument) \
    182 { \
    183   (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
    184     "InvalidArgument","'%s': %s",option,argument); \
    185   DestroyStream(); \
    186   return(MagickFalse); \
    187 }
    188 
    189   char
    190     *filename,
    191     *option;
    192 
    193   const char
    194     *format;
    195 
    196   Image
    197     *image;
    198 
    199   ImageStack
    200     image_stack[MaxImageStackDepth+1];
    201 
    202   MagickBooleanType
    203     fire,
    204     pend,
    205     respect_parenthesis;
    206 
    207   MagickStatusType
    208     status;
    209 
    210   register ssize_t
    211     i;
    212 
    213   ssize_t
    214     j,
    215     k;
    216 
    217   StreamInfo
    218     *stream_info;
    219 
    220   /*
    221     Set defaults.
    222   */
    223   assert(image_info != (ImageInfo *) NULL);
    224   assert(image_info->signature == MagickCoreSignature);
    225   if (image_info->debug != MagickFalse)
    226     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    227   assert(exception != (ExceptionInfo *) NULL);
    228   (void) metadata;
    229   if (argc == 2)
    230     {
    231       option=argv[1];
    232       if ((LocaleCompare("version",option+1) == 0) ||
    233           (LocaleCompare("-version",option+1) == 0))
    234         {
    235           ListMagickVersion(stdout);
    236           return(MagickFalse);
    237         }
    238     }
    239   if (argc < 3)
    240     return(StreamUsage());
    241   format="%w,%h,%m";
    242   (void) format;
    243   j=1;
    244   k=0;
    245   NewImageStack();
    246   option=(char *) NULL;
    247   pend=MagickFalse;
    248   respect_parenthesis=MagickFalse;
    249   stream_info=AcquireStreamInfo(image_info,exception);
    250   status=MagickTrue;
    251   /*
    252     Stream an image.
    253   */
    254   ReadCommandlLine(argc,&argv);
    255   status=ExpandFilenames(&argc,&argv);
    256   if (status == MagickFalse)
    257     ThrowStreamException(ResourceLimitError,"MemoryAllocationFailed",
    258       GetExceptionMessage(errno));
    259   status=OpenStream(image_info,stream_info,argv[argc-1],exception);
    260   if (status == MagickFalse)
    261     {
    262       DestroyStream();
    263       return(MagickFalse);
    264     }
    265   for (i=1; i < (ssize_t) (argc-1); i++)
    266   {
    267     option=argv[i];
    268     if (LocaleCompare(option,"(") == 0)
    269       {
    270         FireImageStack(MagickFalse,MagickTrue,pend);
    271         if (k == MaxImageStackDepth)
    272           ThrowStreamException(OptionError,"ParenthesisNestedTooDeeply",option);
    273         PushImageStack();
    274         continue;
    275       }
    276     if (LocaleCompare(option,")") == 0)
    277       {
    278         FireImageStack(MagickFalse,MagickTrue,MagickTrue);
    279         if (k == 0)
    280           ThrowStreamException(OptionError,"UnableToParseExpression",option);
    281         PopImageStack();
    282         continue;
    283       }
    284     if (IsCommandOption(option) == MagickFalse)
    285       {
    286         Image
    287           *images;
    288 
    289         /*
    290           Stream input image.
    291         */
    292         FireImageStack(MagickFalse,MagickFalse,pend);
    293         filename=argv[i];
    294         if ((LocaleCompare(filename,"--") == 0) && (i < (ssize_t) (argc-1)))
    295           filename=argv[++i];
    296         (void) CopyMagickString(image_info->filename,filename,MagickPathExtent);
    297         images=StreamImage(image_info,stream_info,exception);
    298         status&=(images != (Image *) NULL) &&
    299           (exception->severity < ErrorException);
    300         if (images == (Image *) NULL)
    301           continue;
    302         AppendImageStack(images);
    303         continue;
    304       }
    305     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
    306     switch (*(option+1))
    307     {
    308       case 'a':
    309       {
    310         if (LocaleCompare("authenticate",option+1) == 0)
    311           {
    312             if (*option == '+')
    313               break;
    314             i++;
    315             if (i == (ssize_t) argc)
    316               ThrowStreamException(OptionError,"MissingArgument",option);
    317             break;
    318           }
    319         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    320       }
    321       case 'c':
    322       {
    323         if (LocaleCompare("cache",option+1) == 0)
    324           {
    325             if (*option == '+')
    326               break;
    327             i++;
    328             if (i == (ssize_t) argc)
    329               ThrowStreamException(OptionError,"MissingArgument",option);
    330             if (IsGeometry(argv[i]) == MagickFalse)
    331               ThrowStreamInvalidArgumentException(option,argv[i]);
    332             break;
    333           }
    334         if (LocaleCompare("channel",option+1) == 0)
    335           {
    336             ssize_t
    337               channel;
    338 
    339             if (*option == '+')
    340               break;
    341             i++;
    342             if (i == (ssize_t) argc)
    343               ThrowStreamException(OptionError,"MissingArgument",option);
    344             channel=ParseChannelOption(argv[i]);
    345             if (channel < 0)
    346               ThrowStreamException(OptionError,"UnrecognizedChannelType",
    347                 argv[i]);
    348             break;
    349           }
    350         if (LocaleCompare("colorspace",option+1) == 0)
    351           {
    352             ssize_t
    353               colorspace;
    354 
    355             if (*option == '+')
    356               break;
    357             i++;
    358             if (i == (ssize_t) argc)
    359               ThrowStreamException(OptionError,"MissingArgument",option);
    360             colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
    361               argv[i]);
    362             if (colorspace < 0)
    363               ThrowStreamException(OptionError,"UnrecognizedColorspace",
    364                 argv[i]);
    365             break;
    366           }
    367         if (LocaleCompare("compress",option+1) == 0)
    368           {
    369             ssize_t
    370               compress;
    371 
    372             if (*option == '+')
    373               break;
    374             i++;
    375             if (i == (ssize_t) argc)
    376               ThrowStreamException(OptionError,"MissingArgument",option);
    377             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
    378               argv[i]);
    379             if (compress < 0)
    380               ThrowStreamException(OptionError,"UnrecognizedImageCompression",
    381                 argv[i]);
    382             break;
    383           }
    384         if (LocaleCompare("concurrent",option+1) == 0)
    385           break;
    386         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    387       }
    388       case 'd':
    389       {
    390         if (LocaleCompare("debug",option+1) == 0)
    391           {
    392             ssize_t
    393               event;
    394 
    395             if (*option == '+')
    396               break;
    397             i++;
    398             if (i == (ssize_t) argc)
    399               ThrowStreamException(OptionError,"MissingArgument",option);
    400             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
    401             if (event < 0)
    402               ThrowStreamException(OptionError,"UnrecognizedEventType",argv[i]);
    403             (void) SetLogEventMask(argv[i]);
    404             break;
    405           }
    406         if (LocaleCompare("define",option+1) == 0)
    407           {
    408             i++;
    409             if (i == (ssize_t) argc)
    410               ThrowStreamException(OptionError,"MissingArgument",option);
    411             if (*option == '+')
    412               {
    413                 const char
    414                   *define;
    415 
    416                 define=GetImageOption(image_info,argv[i]);
    417                 if (define == (const char *) NULL)
    418                   ThrowStreamException(OptionError,"NoSuchOption",argv[i]);
    419                 break;
    420               }
    421             break;
    422           }
    423         if (LocaleCompare("density",option+1) == 0)
    424           {
    425             if (*option == '+')
    426               break;
    427             i++;
    428             if (i == (ssize_t) argc)
    429               ThrowStreamException(OptionError,"MissingArgument",option);
    430             if (IsGeometry(argv[i]) == MagickFalse)
    431               ThrowStreamInvalidArgumentException(option,argv[i]);
    432             break;
    433           }
    434         if (LocaleCompare("depth",option+1) == 0)
    435           {
    436             if (*option == '+')
    437               break;
    438             i++;
    439             if (i == (ssize_t) argc)
    440               ThrowStreamException(OptionError,"MissingArgument",option);
    441             if (IsGeometry(argv[i]) == MagickFalse)
    442               ThrowStreamInvalidArgumentException(option,argv[i]);
    443             break;
    444           }
    445         if (LocaleCompare("duration",option+1) == 0)
    446           {
    447             if (*option == '+')
    448               break;
    449             i++;
    450             if (i == (ssize_t) argc)
    451               ThrowStreamException(OptionError,"MissingArgument",option);
    452             if (IsGeometry(argv[i]) == MagickFalse)
    453               ThrowStreamInvalidArgumentException(option,argv[i]);
    454             break;
    455           }
    456         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    457       }
    458       case 'e':
    459       {
    460         if (LocaleCompare("extract",option+1) == 0)
    461           {
    462             if (*option == '+')
    463               break;
    464             i++;
    465             if (i == (ssize_t) argc)
    466               ThrowStreamException(OptionError,"MissingArgument",option);
    467             if (IsGeometry(argv[i]) == MagickFalse)
    468               ThrowStreamInvalidArgumentException(option,argv[i]);
    469             break;
    470           }
    471         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    472       }
    473       case 'h':
    474       {
    475         if ((LocaleCompare("help",option+1) == 0) ||
    476             (LocaleCompare("-help",option+1) == 0))
    477           return(StreamUsage());
    478         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    479       }
    480       case 'i':
    481       {
    482         if (LocaleCompare("identify",option+1) == 0)
    483           break;
    484         if (LocaleCompare("interlace",option+1) == 0)
    485           {
    486             ssize_t
    487               interlace;
    488 
    489             if (*option == '+')
    490               break;
    491             i++;
    492             if (i == (ssize_t) argc)
    493               ThrowStreamException(OptionError,"MissingArgument",option);
    494             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
    495               argv[i]);
    496             if (interlace < 0)
    497               ThrowStreamException(OptionError,"UnrecognizedInterlaceType",
    498                 argv[i]);
    499             break;
    500           }
    501         if (LocaleCompare("interpolate",option+1) == 0)
    502           {
    503             ssize_t
    504               interpolate;
    505 
    506             if (*option == '+')
    507               break;
    508             i++;
    509             if (i == (ssize_t) argc)
    510               ThrowStreamException(OptionError,"MissingArgument",option);
    511             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
    512               argv[i]);
    513             if (interpolate < 0)
    514               ThrowStreamException(OptionError,"UnrecognizedInterpolateMethod",
    515                 argv[i]);
    516             break;
    517           }
    518         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    519       }
    520       case 'l':
    521       {
    522         if (LocaleCompare("limit",option+1) == 0)
    523           {
    524             char
    525               *p;
    526 
    527             double
    528               value;
    529 
    530             ssize_t
    531               resource;
    532 
    533             if (*option == '+')
    534               break;
    535             i++;
    536             if (i == (ssize_t) argc)
    537               ThrowStreamException(OptionError,"MissingArgument",option);
    538             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
    539               argv[i]);
    540             if (resource < 0)
    541               ThrowStreamException(OptionError,"UnrecognizedResourceType",
    542                 argv[i]);
    543             i++;
    544             if (i == (ssize_t) argc)
    545               ThrowStreamException(OptionError,"MissingArgument",option);
    546             value=StringToDouble(argv[i],&p);
    547             (void) value;
    548             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
    549               ThrowStreamInvalidArgumentException(option,argv[i]);
    550             break;
    551           }
    552         if (LocaleCompare("list",option+1) == 0)
    553           {
    554             ssize_t
    555               list;
    556 
    557             if (*option == '+')
    558               break;
    559             i++;
    560             if (i == (ssize_t) argc)
    561               ThrowStreamException(OptionError,"MissingArgument",option);
    562             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
    563             if (list < 0)
    564               ThrowStreamException(OptionError,"UnrecognizedListType",argv[i]);
    565             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
    566               argv+j,exception);
    567             DestroyStream();
    568             return(status == 0 ? MagickFalse : MagickTrue);
    569           }
    570         if (LocaleCompare("log",option+1) == 0)
    571           {
    572             if (*option == '+')
    573               break;
    574             i++;
    575             if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
    576               ThrowStreamException(OptionError,"MissingArgument",option);
    577             break;
    578           }
    579         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    580       }
    581       case 'm':
    582       {
    583         if (LocaleCompare("map",option+1) == 0)
    584           {
    585             (void) CopyMagickString(argv[i]+1,"san",MagickPathExtent);
    586             if (*option == '+')
    587               break;
    588             i++;
    589             SetStreamInfoMap(stream_info,argv[i]);
    590             break;
    591           }
    592         if (LocaleCompare("monitor",option+1) == 0)
    593           break;
    594         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    595       }
    596       case 'q':
    597       {
    598         if (LocaleCompare("quantize",option+1) == 0)
    599           {
    600             ssize_t
    601               colorspace;
    602 
    603             if (*option == '+')
    604               break;
    605             i++;
    606             if (i == (ssize_t) argc)
    607               ThrowStreamException(OptionError,"MissingArgument",option);
    608             colorspace=ParseCommandOption(MagickColorspaceOptions,
    609               MagickFalse,argv[i]);
    610             if (colorspace < 0)
    611               ThrowStreamException(OptionError,"UnrecognizedColorspace",
    612                 argv[i]);
    613             break;
    614           }
    615         if (LocaleCompare("quiet",option+1) == 0)
    616           break;
    617         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    618       }
    619       case 'r':
    620       {
    621         if (LocaleCompare("regard-warnings",option+1) == 0)
    622           break;
    623         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
    624           {
    625             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
    626             break;
    627           }
    628         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    629       }
    630       case 's':
    631       {
    632         if (LocaleCompare("sampling-factor",option+1) == 0)
    633           {
    634             if (*option == '+')
    635               break;
    636             i++;
    637             if (i == (ssize_t) argc)
    638               ThrowStreamException(OptionError,"MissingArgument",option);
    639             if (IsGeometry(argv[i]) == MagickFalse)
    640               ThrowStreamInvalidArgumentException(option,argv[i]);
    641             break;
    642           }
    643         if (LocaleCompare("seed",option+1) == 0)
    644           {
    645             if (*option == '+')
    646               break;
    647             i++;
    648             if (i == (ssize_t) argc)
    649               ThrowStreamException(OptionError,"MissingArgument",option);
    650             if (IsGeometry(argv[i]) == MagickFalse)
    651               ThrowStreamInvalidArgumentException(option,argv[i]);
    652             break;
    653           }
    654         if (LocaleCompare("set",option+1) == 0)
    655           {
    656             i++;
    657             if (i == (ssize_t) argc)
    658               ThrowStreamException(OptionError,"MissingArgument",option);
    659             if (*option == '+')
    660               break;
    661             i++;
    662             if (i == (ssize_t) argc)
    663               ThrowStreamException(OptionError,"MissingArgument",option);
    664             break;
    665           }
    666         if (LocaleCompare("size",option+1) == 0)
    667           {
    668             if (*option == '+')
    669               break;
    670             i++;
    671             if (i == (ssize_t) argc)
    672               ThrowStreamException(OptionError,"MissingArgument",option);
    673             if (IsGeometry(argv[i]) == MagickFalse)
    674               ThrowStreamInvalidArgumentException(option,argv[i]);
    675             break;
    676           }
    677         if (LocaleCompare("storage-type",option+1) == 0)
    678           {
    679             ssize_t
    680               type;
    681 
    682             if (*option == '+')
    683               break;
    684             i++;
    685             if (i == (ssize_t) argc)
    686               ThrowStreamException(OptionError,"MissingArgument",option);
    687             type=ParseCommandOption(MagickStorageOptions,MagickFalse,argv[i]);
    688             if (type < 0)
    689               ThrowStreamException(OptionError,"UnrecognizedStorageType",
    690                 argv[i]);
    691             SetStreamInfoStorageType(stream_info,(StorageType) type);
    692             break;
    693           }
    694         if (LocaleCompare("synchronize",option+1) == 0)
    695           break;
    696         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    697       }
    698       case 't':
    699       {
    700         if (LocaleCompare("taint",option+1) == 0)
    701           break;
    702         if (LocaleCompare("transparent-color",option+1) == 0)
    703           {
    704             if (*option == '+')
    705               break;
    706             i++;
    707             if (i == (ssize_t) argc)
    708               ThrowStreamException(OptionError,"MissingArgument",option);
    709             break;
    710           }
    711         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    712       }
    713       case 'v':
    714       {
    715         if (LocaleCompare("verbose",option+1) == 0)
    716           break;
    717         if ((LocaleCompare("version",option+1) == 0) ||
    718             (LocaleCompare("-version",option+1) == 0))
    719           {
    720             ListMagickVersion(stdout);
    721             break;
    722           }
    723         if (LocaleCompare("virtual-pixel",option+1) == 0)
    724           {
    725             ssize_t
    726               method;
    727 
    728             if (*option == '+')
    729               break;
    730             i++;
    731             if (i == (ssize_t) argc)
    732               ThrowStreamException(OptionError,"MissingArgument",option);
    733             method=ParseCommandOption(MagickVirtualPixelOptions,MagickFalse,
    734               argv[i]);
    735             if (method < 0)
    736               ThrowStreamException(OptionError,"UnrecognizedVirtualPixelMethod",
    737                 argv[i]);
    738             break;
    739           }
    740         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    741       }
    742       case '?':
    743         break;
    744       default:
    745         ThrowStreamException(OptionError,"UnrecognizedOption",option)
    746     }
    747     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
    748       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
    749     if (fire != MagickFalse)
    750       FireImageStack(MagickFalse,MagickTrue,MagickTrue);
    751   }
    752   if (k != 0)
    753     ThrowStreamException(OptionError,"UnbalancedParenthesis",argv[i]);
    754   if (i-- != (ssize_t) (argc-1))
    755     ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]);
    756   if (image == (Image *) NULL)
    757     ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]);
    758   FinalizeImageSettings(image_info,image,MagickTrue);
    759   if (image == (Image *) NULL)
    760     ThrowStreamException(OptionError,"MissingAnImageFilename",argv[i]);
    761   DestroyStream();
    762   return(status != 0 ? MagickTrue : MagickFalse);
    763 }
    764